我在Xtext中遇到了一个递归规则问题。简化后的版本如下:
grammar my.mavenized.HeroLanguage with org.eclipse.xtext.common.Terminals
generate heroLanguage "http://www.mavenized.my/HeroLanguage"
Atomic:
Map |
FunctionCall |
value=ID;
Map:
'map' '{'
(entries+=MapEntry)+
'}';
MapEntry:
'(' key=Atomic ')' '=>' value=Atomic;
FunctionCall:
name=ID '(' arg=Atomic ')';Xtext给出了这个错误消息:
[fatal] rule ruleAtomic has non-LL(*) decision due to recursive rule invocations reachable from alts 2,3. Resolve by left-factoring or using syntactic predicates or using backtrack=true option.但是我找不到左递归问题。Xtext中是否有一些关于左递归的隐式规则?
谢谢。
发布于 2014-02-10 15:28:16
You Map包含一个以Atomic结尾的MapEntry列表。反过来,Atomic可以是FunctionCall,也可以是普通ID。不过,FunctionCall的尾部看起来像是下一个MapEntry的开始。由于该尾部嵌套得非常深,因此无法确定要遵循哪条路径。这就是你的错误信息的来源。您可以使用一个谓词来说服解析器关于on或other path to go,例如
FunctionCall:
name=ID =>'(' arg=Atomic ')'
;如果这对于您的用例是不可能的,那么您可能想要启用回溯,尽管不推荐这样做。
https://stackoverflow.com/questions/21667907
复制相似问题