0

我正在尝试在 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;`

我究竟做错了什么?

4

1 回答 1

0

那么:

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

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

于 2013-02-04T18:29:39.393 回答