我正在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之上的事实就足够了,但显然它没有。
答案 0 :(得分:0)
好的,这是解决方法。我不喜欢它,但它似乎因某种原因而起作用。
在表达规则中,已更改
| expression logicalComparator expression # LogicalComparisonExpression
到
| lhs=expression operator=( DEQUALS
|LSHARP
) rhs=expression # LogicalComparisonExpression
我只在operator =(...)中放置了两个项目用于测试目的。
这有一些负面影响:
强迫我标记'=='而不是'=''='。如果我尝试:
operator =(EQUALS EQUALS | LSHARP)
我将“标签分配给一个不是一组的块”。
我想我会用这个,但我还是要看看能否做得更好。