Xtext:带有一元减号的歧义语法

Xtext: Ambiguous grammar with unary minus

谁能解释一下为什么这是歧义语法? 我有一个相当详尽的语法,并指出了我遇到的错误:

Expressions:
    AdditionOrSubtraction;

AdditionOrSubtraction:
    UnaryExpression ((PLUS | MINUS) UnaryExpression)*
;
UnaryExpression:
    MINUS Expressions
    | Atom
;
Atom returns Expression:
    INT
;

我查看了 java 规范,它给出了类似的表达式: http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-MultiplicativeExpression

我将其简化并显示如下:

MultiplicativeExpression:
    UnaryExpression 
    MultiplicativeExpression * UnaryExpression
    MultiplicativeExpression / UnaryExpression
    MultiplicativeExpression % UnaryExpression

UnaryExpression:
    + UnaryExpression 
    - UnaryExpression 
    Literal

Literal:
    IntegerLiteral 

当我尝试 运行 时收到以下错误消息: "Decision can match input such as "RULE_MINUS {RULE_MINUS, ......}" 使用多个选项:1、2 因此,该输入的备选方案 2 被禁用

你的语法有歧义,因为它可以被解析为两个不同的、同样有效的树。请考虑输入 1 - 2 - 3。可以用两种方式阅读它(添加括号以强调模棱两可的优先顺序:

  • 1 - ( 2 - 3 )
  • (1 - 2) - 3

您需要将其修改为

UnaryExpression: MINUS Primary | Primary;
Primary: '(' Expressions ')' | Atom;

消除歧义。