ANTLRWorks:无法让运营商工作

时间:2011-07-08 17:23:45

标签: antlr antlr3 antlrworks

我一直在努力学习ANTLR一段时间,最后得到了最终的ANTLR参考资料。 好吧,我在ANTLRWorks 1.4中尝试了以下内容

grammar Test;

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

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

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

当我传递2 + 4和进程表达式时,我没有得到一个树,其中+为根,2和4为子节点。相反,我将表达式作为根,将2,+和4作为子节点放在同一级别。

无法弄清楚我做错了什么。绝望地需要帮助。

BTW如何获得这些图形描述?

1 个答案:

答案 0 :(得分:1)

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

我刚刚为您的示例添加了一个虚拟标记PLUS以及一个显示您期望的结果的重写表达式。 但似乎你已经找到了解决方案: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;}
    ;