Xtext中的左递归问题“此规则调用是左递归调用图的一部分。”

时间:2019-07-02 12:47:06

标签: java xtext

我已经编写了一些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 :(得分:0)

一个问题是Folge和带有Atom的NonEmptyList相同。因此您可以省略后者。

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

类似地,您必须在这里使用语法谓词帮助解析器

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