2017-08-23 27 views
0

私はifとelse-ifのすべての条件式を取得するJavaの言語解析ツールを構築しています。ANTLR Java文法を使用してIF条件で各条件をトラバースする方法

したがって、私は書き込んで、enterStatement()をオーバーライドしました。

public void enterStatement(@NotNull apexParser.StatementContext ctx) { 
    if(ctx.IF() != null) { 
     // System.out.println(ctx.IF().getSourceInterval()); 

     TokenStream tokens = parser.getTokenStream(); 
     System.out.println(tokens.getText(ctx.IF().getSourceInterval())); 
     System.out.println(parser.getTokenStream().getText(ctx)); 

     //System.out.println(ctx.IF().getText()); 
     //System.out.println(ctx.toStringTree(parser)); 
     //System.out.println(ctx.IF().getSymbol().getText()); 
    } 
} 

ここで使用されている各条件のトラバース方法はわかりません。

例: 場合(> 1 & & B < 0)

はちょうど私が条件ツリーをトラバースする方法を知りたいです。

:私はANTLRツールで非常に新しくなっています。詳細情報が必要な場合は教えてください。

+0

どのような文法を使っていますか? – Raven

答えて

0

あなたのフォローアップをありがとう、私はJavaの文法ファイルを使用していました。

最後に、以下のコードを使用して個々のノードをトラバースする解決策を見つけることができました。それは他の人を助けることができるように

@Override 
public void enterStatement(@NotNull apexParser.StatementContext ctx) { 
    System.out.println(this.thisClass + "." + this.thisMethod); 
    if(ctx.IF() != null) { 
     // System.out.println(ctx.IF().getSourceInterval()); 

     for(int i = 0; i < ctx.parExpression().getChild(1).getChildCount(); i++) { 
      if(ctx.parExpression().getChild(1).getChild(i).getChildCount() > 1) { 
       for(int j = 0; j < ctx.parExpression().getChild(1).getChild(i).getChildCount(); j++) { 
        System.out.println(ctx.parExpression().getChild(1).getChild(i).getChild(j).getText()); 
       } 
      } else { 
       System.out.println(ctx.parExpression().getChild(1).getChild(i).getText()); 
      } 
     } 

     //TokenStream tokens = parser.getTokenStream(); 
     //System.out.println(tokens.getText(ctx.IF().getSourceInterval())); 
     //System.out.println(parser.getTokenStream().getText(ctx)); 

     //System.out.println(ctx.IF().getText()); 
     //System.out.println(ctx.toStringTree(parser)); 
     //System.out.println(ctx.IF().getSymbol().getText()); 
    } 
} 

はちょうどそれをここに掲示します。

注:私のコードは最適化されていないことを知っています。それは単なるヒントです。

関連する問題