2015-06-30 3 views
0

Я пытаюсь использовать Xtext для создания простого языка для операций над наборами чисел.Неограничиваемость грамматики Xtext (Backtracking не работает)

Вот некоторые примеры строк на языке:

  • {2,1} + 6 (набор чисел 2 и 7)
  • {1 + 3, 3 + 5} + { 2..5} (объединение множеств {4, 8} и {2, 3, 4, 5})

Я использую следующую грамматику:

grammar org.example.Set with org.eclipse.xtext.common.Terminals 

generate set "http://www.set.net/set" 




SetAddition returns SetExpression: 
    SetMultiplication ({SetAddition.left=current} '+' right=SetMultiplication)*  
; 

SetMultiplication returns SetExpression: 
    SetPrimary ({SetMultiplication.left=current} ('*'|'\\') right=SetPrimary)* 
; 

SetPrimary returns SetExpression: 
    SetAtom | '(' SetAddition ')' 
; 

SetAtom returns SetExpression: 
    Set | Range 
; 

Set: 
    lhs = '{' (car=ArithmeticTerm (',' cdr+=ArithmeticTerm)*)? '}' 
; 

Range: 
    '{' lhs=ArithmeticTerm '.' '.' rhs=ArithmeticTerm '}' 
; 
ArithmeticTerm: 
    Addition //| Multiplication 
; 

Addition returns ArithmeticTerm: 
    Multiplication ({Addition.lhs=current} ('+'|'-') rhs=Multiplication)* 
; 

Multiplication returns ArithmeticTerm: 
    Primary ({Multiplication.lhs=current} ('*'|'/'|'%') rhs=Primary)* 
; 

Primary returns ArithmeticTerm: 
    ArithmeticAtom | 
    '(' Addition ')' 
; 

ArithmeticAtom: 
     value = INT 
; 

Когда я выполнить MWE2 рабочий процесс, я получаю e следующая ошибка:

error(211): ../net.certware.argument.language.ui/src-gen/net/certware/argument/language/ui/contentassist/antlr/internal/InternalL.g:420:1: [fatal] rule rule__SetAtom__Alternatives has non-LL(*) decision due to recursive rule invocations reachable from alts 1,2. Resolve by left-factoring or using syntactic predicates or using backtrack=true option. 

У меня есть откат в файле mwe2.

У меня есть этот фрагмент кода в нем:

// The antlr parser generator fragment. 
     fragment = parser.antlr.XtextAntlrGeneratorFragment auto-inject { 
      options = { 
       backtrack = true 
      } 
     } 

И нет никаких других фрагментов, которые упоминают ANTLR в mwe2 файле.

Версия Xtext, которую я использую, - это Xtext 2.8.0, интегрированный в Full Eclipse, доступный с сайта Xtext.

Почему ANTLR предлагает мне включить backtracking, если он уже включен? Что-то не так с моей грамматикой?

ответ

1

Ошибка проистекает из вашего синтаксиса для

SetPrimary returns SetExpression: 
    SetAtom | '(' SetAddition ')' 
; 

и

Primary returns ArithmeticTerm: 
    ArithmeticAtom | 
    '(' Addition ')' 
; 

, которая может быть уменьшена до

SetPrimary returns SetExpression: 
    ArithmeticAtom | '(' Addition ')' | '(' SetAddition ')' 
; 

Так как Сложение и SetAddition неразличимы с конечным опережающего просмотра (оба могут начните с бесконечного числа открытий (). Поэтому вам нужно, в первую очередь, обратное отслеживание - вы можете пересмотреть синтаксис или структуру AST.

В любом случае, пожалуйста, добавьте обратный отсчет также в XtextAntlrUiGeneratorFragment в свой рабочий процесс.

+0

Спасибо !!! Я согласен, что грамматика не LL (k) для любого K. Модификация XtextAntlrUiGeneratorFragment помогла! –

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