2017-07-22 4 views
1

J'essaie d'analyser les fichiers de classe Java en utilisant la grammaire Java.g4 (du site github Antlr4) et Antlr4. Je suis en train d'analyserANTLR4 Méthode du visiteur pour les règles alternatives

typeArguments 
: '<' typeArgument (',' typeArgument)* '>' 
; 

typeArgument 
: typeType 
| '?' (('extends' | 'super') typeType)? 
; 

Comment puis-je analyser des chaînes qui sont de type « ? Prolonge TypeType » ou « ? Super TypeType »? Voici ma classe de visiteurs.

public class TypeArgumentsVisitor extends JavaBaseVisitor<String> { 
public String visitTypeArguments(JavaParser.TypeArgumentsContext ctx) { 
    String delimiter = ""; 
    StringBuilder typArgSb = new StringBuilder("<"); 
    for(TypeArgumentContext typArg :ctx.typeArgument()){ 
     String arg = visit(typArg); 
     typArgSb.append(delimiter).append(arg); 
     delimiter = ","; 
    } 
    typArgSb.append(">"); 
    return typArgSb.toString(); 
} 

public String visitTypeArgument(JavaParser.TypeArgumentContext ctx) { 
    TypeTypeVisitor visitor = new TypeTypeVisitor(); 
    TypeTypeContext typTypCtx = ctx.typeType(); 
    if(//condition for first){ 
     // Code for first rule typeType 
    } 
    else{ 
     //Code for second rule '?' (('extends' | 'super') typeType)? 
    } 
    return null; 
} 
} 

Modifier: Je l'ai mis en œuvre de cette façon maintenant. Merci à @ Mike

public String visitTypeArgument(JavaParser.TypeArgumentContext ctx) { 
    //TypeTypeVisitor visitor = new TypeTypeVisitor(); 
    StringBuilder typArg = new StringBuilder(); 
    if(ctx.getChild(0).getText().equalsIgnoreCase("?")){ 
     // '?' (('extends' | 'super') typeType)? 
     typArg.append("?").append(" "); 
     TypeTypeContext typTypCtx = ctx.typeType(); 
     if(typTypCtx != null){ 
      typArg.append(ctx.getChild(1).getText()).append(" "); 
      typArg.append(this.visitTypeType(typTypCtx)); 
     } 
    } 
    else{ 
     TypeTypeContext typTypCtx = ctx.typeType(); 
     typArg.append(this.visitTypeType(typTypCtx)); 
    } 
    return typArg.toString(); 
} 

Répondre

0

Toutes les fonctions d'accès au contexte comme ctx.typeType() et ctx.typeArgument sont simplement des fonctions de confort et se retrouvent dans le contexte de l'enfant d'un contexte d'analyse syntaxique. Ainsi, pour des cas spéciaux comme celui-ci (et lorsque vous n'êtes pas sûr de la façon d'accéder aux éléments invidivuels), parcourez les contextes enfants pour apprendre ce qui a été reconnu.

Dans votre cas, vous pouvez probablement utiliser le premier contexte enfant pour voir s'il s'agit d'un point d'interrogation. Si c'est le cas, le deuxième alt a été choisi, sinon le premier. Pour la deuxième alt, vous pouvez ensuite vérifier le deuxième enfant pour voir si c'est extends ou super et enfin l'enfant suivant pour typeType (ou utilisez la fonction typeType() du contexte pour cela, comme vous le souhaitez).