Antlr4:同时处理优先级和左侧递归

Antlr4:同时处理优先级和左侧递归,antlr,grammar,antlr4,Antlr,Grammar,Antlr4,我正在用Antlr4编写一个语言解析器。我对它已经相当精通,但我不想再次陷入陷阱,所以它就在这里: expression | gate=expression QUESTION (ifTrue=expression)? COLON (ifFalse=expression)? # TernaryExpression | Identifier #

我正在用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之上的事实就足够了,但显然不行。

好的,这里是解决方法。我不喜欢它,但出于某种原因它似乎奏效了

在表达式规则中,已更改

|   expression logicalComparator expression # LogicalComparisonExpression

我只在运算符=。。。用于测试目的

但这也有一些负面影响:


经过一些额外的研究后,我发现:这似乎表明,问题在于Antlr。。。
|   lhs=expression operator=(   DEQUALS
                                 |LSHARP
                             ) rhs=expression # LogicalComparisonExpression