2011-07-08 55 views
1

我一直在努力学习ANTLR了一段时间,终于拿到了我的手权威ANTLR参考。 嗯,我尝试了以下的ANTLRWorks 1.4ANTLRWorks:无法获得运营商合作

grammar Test; 

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

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

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

当我通过2 + 4,处理的表情,我没有得到一个树+为根,2和4的子节点。相反,我得到表达式作为根,2,+和4作为子节点处于同一级别。

不能找出我做错了。绝对需要帮助。

BTW我怎样才能得到这些图形的描述?

+0

发现这个[http://stackoverflow.com/questions/2856612/visualizing-an-ast-created-with-antlr-in-a -net环境(http://stackoverflow.com/questions/2856612/visualizing-an-ast-created-with-antlr-in-a-net-environment)告诉如何让图形表示。还有一条评论提到antlrworks解释器忽略了操作!和^ – Puneet

回答

1

是的,你得到了表达,因为它是你的唯一的规则expression正在返回的表达式。

我刚才添加虚拟标志​​你的例子与重写的表达,显示您的期待结果一起。 但似乎你已经找到了解决办法:O)

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