我想使用ANTLR生成一个AST,我可以手动行走(使用手写的访问者代码而不是ANTLR的树语法。)说我有以下语法
expr : term ( ( PLUS | MINUS )^ term )*;
term : factor ( ( MULT | DIV )^ factor )* ;
factor : NUMBER
我希望expr
和term
同时生成类型为BinaryExpression
的AST节点,当且仅当有匹配的运算符(加号,减号,次数或除法)时,并产生一个普通的NUMBER
。我知道我可以附加像$type = "BINARYEXPRESSION"
这样的动作,但这似乎是一个黑客攻击。有更好的方法吗?使用ANTLR为手动遍历的树生成解析器是一个坏主意吗?
修改
我试过
expr : term ( ( PLUS<BinaryExpression> | MINUS<BinaryExpression> )^ term )*;
但是a)这似乎没有任何影响(生成的节点仍然是CommonTree和CommonToken的实例),以及b)为了节省重复,我希望这个类型应用于构造的整个节点通过给定的规则,而不是将类型应用于当前规则的子节点。即我不应该将<Identifier>
放在每个标识符为子项的规则中。