如何指定ANTLR AST节点类型?

时间:2013-01-03 05:20:21

标签: python antlr

我想使用ANTLR生成一个AST,我可以手动行走(使用手写的访问者代码而不是ANTLR的树语法。)说我有以下语法

expr    : term ( ( PLUS | MINUS )^  term )*;

term    : factor ( ( MULT | DIV )^ factor )* ;

factor  : NUMBER

我希望exprterm同时生成类型为BinaryExpression的AST节点,当且仅当有匹配的运算符(加号,减号,次数或除法)时,并产生一个普通的NUMBER。我知道我可以附加像$type = "BINARYEXPRESSION"这样的动作,但这似乎是一个黑客攻击。有更好的方法吗?使用ANTLR为手动遍历的树生成解析器是一个坏主意吗?

修改

我试过

expr    : term ( ( PLUS<BinaryExpression> | MINUS<BinaryExpression> )^  term )*;

但是a)这似乎没有任何影响(生成的节点仍然是CommonTree和CommonToken的实例),以及b)为了节省重复,我希望这个类型应用于构造的整个节点通过给定的规则,而不是将类型应用于当前规则的子节点。即我不应该将<Identifier>放在每个标识符为子项的规则中。

1 个答案:

答案 0 :(得分:0)

典型的语法是Terminal<ASTNodeType>(点击以供参考),但由于看起来你正在使用Python目标,你必须验证这一点。