2017-07-22 11 views
1

Java.g4(Antlr4 githubサイトの)文法とAntlr4を使用してJavaクラスファイルを解析しようとしています。私は解析しようとしていますANTLR4代替ルールの訪問者メソッド

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

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

"?extends typeType"または "?super typeType"の文字列をどのように解析できますか?以下は私の訪問者クラスです。

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

編集:私は今、このように実装しています。 ctx.typeType()ctx.typeArgumentなどの

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

答えて

0

すべてのコンテキストのアクセス機能は、単に便利な機能であり、最終的に解析コンテキストの子コンテキストで終わる@マイクに感謝します。そのような特殊なケース(そして、あなたが無神論的要素にアクセスする方法がわからないとき)は、子のコンテキストを繰り返して何が認識されたのかを知ることができます。

おそらく最初の子コンテキストを使用して、それが疑問符であるかどうかを確認できます。そうであれば、2番目のaltが選択され、そうでなければ最初のaltが選択されました。 2番目の子供のために、2番目の子供がextendsまたはsuperで、最後にtypeTypeの子供がいるかどうかを確認することができます(または、コンテキストのtypeType()機能を使用してください)。