Я пытаюсь использовать 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, если он уже включен? Что-то не так с моей грамматикой?
Спасибо !!! Я согласен, что грамматика не LL (k) для любого K. Модификация XtextAntlrUiGeneratorFragment помогла! –