2011-07-08 9 views
1

私はしばらくの間ANTLRを学ぼうとしていましたが、最終的にANTLRの参考になっています。 まあ私は2 + 4とプロセス式を渡すとき、私は子ノードとしてルートとして+と2と4で木を得ることはありませんANTLRWorks 1.4ANTLRWorks:オペレーターを働かせることができません

grammar Test; 

INT : '0'..'9'+ 
    ; 

WS : (' ' 
     | '\t' 
     | '\r' 
     | '\n' 
     ) {$channel=HIDDEN;} 
    ; 

expression 
    : INT ('+'^ INT)*; 

で、次の試してみました。むしろ、私は同じレベルで子ノードとしてルートと2、+と4として式を取得します。

私が間違っていることを理解できません。必要な助けが必要です。

私はどのようにこれらのグラフィック記述を取得できますか?

+0

)oがこの[http://stackoverflow.com/questions/2856612/visualizing-an-ast-created-with-antlr-in-aを見つけました-net-environment](http://stackoverflow.com/questions/2856612/visualizing-an-ast-created-with-antlr-in-a-net-environment)を参照してください。また、antlrworksのインタプリタがtjeオペラを無視しているとのコメントもあります。そして、 – Puneet

答えて

1

はい、唯一のルールexpressionが返す式なので、式が得られます。

仮想トークン​​を、あなたの期待する結果を示すリライト式と共にあなたの例に追加しました。 しかし、あなたが既に解決策を発見したようだ:

grammar Test; 

options { 
    output=AST; 
    ASTLabelType = CommonTree; 
} 
tokens {PLUS;} 

@members { 
    public static void main(String [] args) { 
      try { 
      TestLexer lexer = 
       new TestLexer(new ANTLRStringStream("2+2")); 
      CommonTokenStream tokens = new CommonTokenStream(lexer); 
      TestParser parser = new TestParser(tokens); 
      TestParser.expression_return p_result = parser.expression(); 

      CommonTree ast = p_result.tree; 
      if(ast == null) { 
       System.out.println("resultant tree: is NULL"); 
      } else { 
       System.out.println("resultant tree: " + ast.toStringTree()); 
      } 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
     } 
} 

expression 
    : INT ('+' INT)* -> ^(PLUS INT+); 

INT : '0'..'9'+ 
    ; 

WS : (' ' 
     | '\t' 
     | '\r' 
     | '\n' 
     ) {$channel=HIDDEN;} 
    ; 
関連する問題