2015-01-15 44 views
0

有人能解釋爲什麼這是模棱兩可的語法嗎? 我有一個相當複雜的語法,並釘上,我有到這個錯誤: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,......}’全光照g多種選擇:1,2 因此,對於該輸入禁用替代項2「

+1

難道你翻譯這個簡單的語法像'A - > AB','乙 - > aB',' A - > aa'。我希望你對抽象語法很熟悉,否則這個評論對你來說沒有什麼意義。我可以告訴你爲什麼它是模糊的,但我不知道這種語言的語法和結構。 – ShellFish

回答

3

您的文法不明確,因爲它可能被解析爲兩個不同的同樣有效的樹。請考慮輸入1 - 2 - 3。這將有可能以兩種方式閱讀(parethesis加強調曖昧precedencies:

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

你會需要修改它

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

的歧義它