【问题标题】:Xtext: Ambiguous grammar with unary minusXtext:一元减号的模棱两可的语法
【发布时间】:2015-01-15 00:48:58
【问题描述】:

有人能解释一下为什么这是模棱两可的语法吗? 我有一个相当复杂的语法,并且已经确定了我对此的错误:

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 因此,该输入禁用了备选方案 2"

【问题讨论】:

  • 你能把它翻译成简单的语法,比如A -> ABB -> aBA -> aa。我希望你熟悉抽象语法,否则这个评论对你来说没有多大意义。我可以告诉你为什么它会模棱两可,但我不知道这种语言的语法和结构。

标签: parsing antlr antlr3 xtext


【解决方案1】:

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

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

您需要将其修改为

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

消除歧义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    相关资源
    最近更新 更多