我一直在努力学习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如何获得这些图形描述?
答案 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;}
;