由于递归规则调用,Xtext规则具有非LL(*)决策

时间:2013-01-16 12:02:27

标签: syntax grammar xtext

我试图在Xtext中实现一个简单的语法,以识别一个由ID和函数调用组成的函数调用除以点(类似Java的语法)。即任何由ID和/或函数组成的链,总是以函数结束。

示例源代码:a.b(a).c(b()).b.d();

我编写了以下Xtext语法:

Test: Chain ';';
Chain: (IdOrFunc '.')* ID Func;
IdOrFunc: ID Func?;
Func: '(' IdOrFunc? ')';

但是,在尝试通过Xtext生成语言代码时出现以下错误:

[fatal] rule ruleChain 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.

如果我将ID规则中的Chain替换为'xyz',即

,语法就会开始工作
Chain: (IdOrFunc '.')* 'xyz' Func;`

我做错了什么?

1 个答案:

答案 0 :(得分:0)

那怎么样:

Test: Chain ';';
Chain: IdOrFunc ('.' ID Func)*;
IdOrFunc: ID Func?;
Func: '(' IdOrFunc? ')';

我并不完全确定它会解析完全相同的表达式,因为我只是快速查看它(左递归在(IdOrFund'。')*语句中)。

相关问题