我有一个解析器和一个AST。现在我想要一个Treewalkergrammar。在AST中有一个标记“=”。
Treewalker应该在:
中找到“=”标记relationalExpression
: (numericExpression) ( (^(EQUAL relationalExpression))
| (^(NOT_EQUAL relationalExpression))
)?
;
虽然顶部令牌应该是“=”或“!=”,但编译器只是查看“numericExpression”并发现它不是“=”令牌。最后,它导致错误“在输入'='”没有可行的替代方案。
所以“=”是解析器的顶级标记,但不适用于树木行者。
这里有什么问题?
非常感谢
答案 0 :(得分:0)
您可能打算以树形式写relationalExpression
,其中numericExpression
可能是EQUAL
的孩子,而不是其中的兄弟。
// tree parser rule:
relationalExpression
: ^(EQUAL numericExpression relationalExpression)
| ^(NOT_EQUAL numericExpression relationalExpression)
| numericExpression
;
这当然是假设您的解析器具有relationalExpression
规则,其中包含以下格式(使用AST运算符^
):
// parser rule:
relationalExpression
: numericExpression
( EQUAL^ relationalExpression
| NOT_EQUAL^ relationalExpression
)?
;
或以下,它使用重写运算符->
:
// parser rule:
relationalExpression
: numericExpression
( EQUAL relationalExpression
-> ^(EQUAL numericExpression relationalExpression)
| NOT_EQUAL relationalExpression
-> ^(NOT_EQUAL numericExpression relationalExpression)
)?
;