Antlr4:同时处理优先级和左侧递归
我正在用Antlr4编写一个语言解析器。我对它已经相当精通,但我不想再次陷入陷阱,所以它就在这里:Antlr4:同时处理优先级和左侧递归,antlr,grammar,antlr4,Antlr,Grammar,Antlr4,我正在用Antlr4编写一个语言解析器。我对它已经相当精通,但我不想再次陷入陷阱,所以它就在这里: expression | gate=expression QUESTION (ifTrue=expression)? COLON (ifFalse=expression)? # TernaryExpression | Identifier #
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之上的事实就足够了,但显然不行。好的,这里是解决方法。我不喜欢它,但出于某种原因它似乎奏效了 在表达式规则中,已更改
| expression logicalComparator expression # LogicalComparisonExpression
到
我只在运算符=。。。用于测试目的
但这也有一些负面影响:
经过一些额外的研究后,我发现:这似乎表明,问题在于Antlr。。。
| lhs=expression operator=( DEQUALS
|LSHARP
) rhs=expression # LogicalComparisonExpression