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

时间:2013-11-04 07:58:14

标签: antlr grammar antlr4

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

1 个答案:

答案 0 :(得分:0)

好的,这是解决方法。我不喜欢它,但它似乎因某种原因而起作用。

在表达规则中,已更改

|   expression logicalComparator expression # LogicalComparisonExpression

|   lhs=expression operator=(   DEQUALS
                                 |LSHARP
                             ) rhs=expression # LogicalComparisonExpression

我只在operator =(...)中放置了两个项目用于测试目的。

这有一些负面影响:

  1. 运算符的内联定义< - 我希望将它们分开以便于阅读。
  2. 强迫我标记'=='而不是'=''='。如果我尝试:

    operator =(EQUALS EQUALS | LSHARP)

  3. 我将“标签分配给一个不是一组的块”。

    我想我会用这个,但我还是要看看能否做得更好。