Проблема левой рекурсии в Xtext «Этот вызов правила является частью левого графа рекурсивных вызовов». - PullRequest
0 голосов
/ 02 июля 2019

Я написал некоторый код Xtext и попытался изобразить Prologsyntax.Теперь у меня есть проблема с левой рекурсией, и я не знаю, что это такое и как решить мою проблему.

Строка NotEmptyList вызвала некоторые ошибки.

PrologDsl: program=Program exquery=Exquery; 
Program: clause+=Clause+;
Exquery: '?-' query=Query '.';  
Query: predicate=Predicate (',' nthPredicate+=Predicate)*;
Clause: fact=Fact | rule=Rule;
Fact: predicate=Predicate '.';
Rule: predicate=Predicate ':-' query=Query '.';
Predicate: functor=Functor '(' term=Term (',' nthTerm+=Term)* ')';
Functor:IDENT;
Term:atom=Atom|list=List;
Atom: atom=(IDENT| VARIABLE | NUMBER);
List: emptyList = '[]' | list = NotEmptyList;
NotEmptyList: '[' folge=Folge ']' | '[' atom=Atom | term=Term ']';
Folge: atom=Atom (',' nthAtom+=Atom)* ;

terminal NUMBER:INT;
terminal VARIABLE: 'A'..'Z';
terminal IDENT: 'a'..'z'('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;

Я верю, чтоЯ должен включить некоторые новые правила или я могу что-то упростить?

Извините, я паршивый новичок.

Заранее спасибо!

1 Ответ

0 голосов
/ 02 июля 2019

одна проблема в том, что Folge и NonEmptyList с Atom одинаковы. так что вы можете опустить последнее.

List: emptyList = '[]' | list = NotEmptyList;
NotEmptyList: '[' (folge=Folge  | term=Term) ']';

аналогично, вы должны помочь парсеру здесь с синтаксическими предикатами

Fact: =>(predicate=Predicate '.');
Rule: =>(predicate=Predicate ':-') query=Query '.';
...