2017-07-22 6 views
1

Ich versuche, Java-Klassen-Dateien mit Java.g4 (von Antlr4 github Website) Grammatik und Antlr4 zu analysieren. Ich versuche,ANTLR4 Besucher Methode für alternative Regeln

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

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

zu analysieren Wie kann ich Strings analysieren, die vom Typ sind? „Erstreckt sich typeType“ oder „? Super typeType“? Unten ist meine Besucherklasse.

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; 
} 
} 

bearbeiten: Ich habe nun auf diese Weise umgesetzt. Dank

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(); 
} 

Antwort

0

All Kontext-Zugriffsfunktionen wie ctx.typeType() und ctx.typeArgument zu @ Mike sind einfach Komfortfunktionen und letztlich an den Kindern Kontexte eines Parse-Kontextes am Ende. Für spezielle Fälle wie diesen (und wenn Sie nicht sicher sind, wie Sie auf inviduale Elemente zugreifen), durchlaufen Sie die untergeordneten Kontexte, um zu erfahren, was erkannt wurde.

In Ihrem Fall können Sie wahrscheinlich den ersten Kindkontext verwenden, um zu sehen, ob das ein Fragezeichen ist. Wenn ja, wurde die zweite Alternative gewählt, ansonsten die erste. Für die zweite Alternative können Sie dann das zweite Kind überprüfen, ob das extends oder super ist und schließlich das nächste Kind für typeType (oder verwenden Sie die typeType() Funktion des Kontexts dafür, wie Sie wünschen).

Verwandte Themen