我已经编写了一些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')*;
我相信我必须包含一些新规则,还是可以简化一些事情?
对不起,我是一个糟糕的初学者。
谢谢!
答案 0 :(得分:0)
一个问题是Folge和带有Atom的NonEmptyList相同。因此您可以省略后者。
List: emptyList = '[]' | list = NotEmptyList;
NotEmptyList: '[' (folge=Folge | term=Term) ']';
类似地,您必须在这里使用语法谓词帮助解析器
Fact: =>(predicate=Predicate '.');
Rule: =>(predicate=Predicate ':-') query=Query '.';