我正在用 Antlr4 编写语言解析器。我已经非常精通它了,但我不想(再次)陷入陷阱,所以这里是:
expression
| gate=expression QUESTION
(ifTrue=expression)? COLON
(ifFalse=expression)? # TernaryExpression
| Identifier # IdentifierExpression
| literal # LiteralExpression
| expression logicalComparator expression # LogicalComparisonExpression
| expression logicalOperator expression # LogicalOperationExpression
;
和输入:
user.field == 'STRING' ? user.field + user.otherField : user.somethingElse
我得到的树是:
(expression
(expression
(expression user) . (expression field)
)
(logicalComparator = =)
(expression
(expression (literal 'STRING'))
? (expression
(expression
(expression user) . (expression field)
)
(binaryOperator +)
(expression
(expression user) . (expression otherField)
)
)
: (expression
(expression user) . (expression somethingElse)
)
)
)
(逻辑比较的表达式,其中左侧是 user.field,比较器是 ==,右侧是三元运算符。)
实际结果应该是一个三元运算符,其中门表达式是一个逻辑比较。
我该如何解决?我确信,我将 TernaryExpression 放在 LogicalComparisonExpression 之上的事实就足够了,但显然它没有。