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

时间:2015-01-15 00:48:58

标签: parsing antlr antlr3 xtext

有人可以解释为什么这是一个含糊不清的语法? 我有一个相当精细的语法并且已经解决了我对此的错误:

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 

尝试运行时收到以下错误消息: "决策可以匹配输入,例如" RULE_MINUS {RULE_MINUS,......}"使用多种选择:1,2 结果,替代品(s)2被禁用了该输入"

1 个答案:

答案 0 :(得分:3)

你的语法很模糊,因为它可以解析成两个不同的,同样有效的树。请考虑输入1 - 2 - 3。有可能以两种方式阅读它(添加了parethesis以强调不明确的先例:

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

您需要将其修改为

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

消除歧义。