0

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

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

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

factor  : NUMBER

当且仅当有一个运算符(加号、减号、次或除号)被匹配时,我都希望expr生成term具有类型的 AST 节点,否则生成一个普通的节点。我知道我可以附加一个类似的动作,但这似乎是一个 hack。有更好的方法吗?使用 ANTLR 为手动遍历的树生成解析器是个坏主意吗?BinaryExpressionNUMBER$type = "BINARYEXPRESSION"

编辑:

我试过了

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

但是a)这似乎根本没有任何影响(产生的节点仍然是CommonTree和CommonToken的实例),并且b)为了节省重复,我希望这种类型应用于由给定构造的整个节点规则,而不是将类型应用于当前规则的子节点。即我不应该把<Identifier>所有有标识符的规则都作为孩子。

4

1 回答 1

0

典型的语法是Terminal<ASTNodeType>(点击查看),但由于您使用的是 Python 目标,因此您必须验证这一点。

于 2013-01-03T07:36:37.257 回答