2015-01-15 3 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

Не могли бы вы перевести это простой грамматики, как 'А -.> aB',' B -> aB', ' A -> aa'. Надеюсь, вы знакомы с абстрактными грамматиками, иначе этот комментарий не будет иметь большого смысла для вас. Я могу сказать вам, почему это неоднозначно, но я не знаю синтаксиса и структуры этого языка. – ShellFish

ответ

3

Вы грамматика неоднозначна, поскольку она может быть проанализирована на два разных, одинаково допустимых дерева. Пожалуйста, обратите внимание на вход 1 - 2 - 3. Можно было бы прочитать его двумя способами (parethesis добавил подчеркнуть неоднозначные precedencies:

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

Вы бы необходимо изменить его

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

к неоднозначности его

 Смежные вопросы

  • Нет связанных вопросов^_^