Antlr树行者找不到令牌?
我有一个解析器和一个AST。现在我想要一个树蜡。在AST中有一个标记“=” Treewalker应该在以下位置找到“=”标记:Antlr树行者找不到令牌?,antlr,antlr3,Antlr,Antlr3,我有一个解析器和一个AST。现在我想要一个树蜡。在AST中有一个标记“=” Treewalker应该在以下位置找到“=”标记: relationalExpression : (numericExpression) ( (^(EQUAL relationalExpression)) | (^(NOT_EQUAL relationalExpression)) )? ; 尽管最上面的标记应该是“=”
relationalExpression
: (numericExpression) ( (^(EQUAL relationalExpression))
| (^(NOT_EQUAL relationalExpression))
)?
;
尽管最上面的标记应该是“=”或“!=”,但编译器只是查看“numericExpression”并发现它不是“=”标记。最后,它会导致错误“在输入“=”时没有可行的替代方案”
所以“=”是解析器的顶级标记,但不是treewalker的
这里怎么了
非常感谢您可能想以树状形式编写
关系表达式
,其中数值表达式
很可能是相等的子表达式,而不是它的兄弟
// tree parser rule:
relationalExpression
: ^(EQUAL numericExpression relationalExpression)
| ^(NOT_EQUAL numericExpression relationalExpression)
| numericExpression
;
当然,这是假设解析器有一个relationalExpression
规则,其形式如下(使用AST运算符^
):
或者使用重写运算符->
:
// parser rule:
relationalExpression
: numericExpression
( EQUAL relationalExpression
-> ^(EQUAL numericExpression relationalExpression)
| NOT_EQUAL relationalExpression
-> ^(NOT_EQUAL numericExpression relationalExpression)
)?
;
// parser rule:
relationalExpression
: numericExpression
( EQUAL relationalExpression
-> ^(EQUAL numericExpression relationalExpression)
| NOT_EQUAL relationalExpression
-> ^(NOT_EQUAL numericExpression relationalExpression)
)?
;