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