2014-02-10 84 views
0

我遇到了Xtext中的递归规则问题。简化版本如下: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中是否存在关于左递归的隐式规则?

谢谢。

回答

0

Map包含一个列表MapEntry s以Atomic结尾。 Atomic依次是FunctionCall或简单的ID。不过,FunctionCall的尾部看起来像是下一个MapEntry的开始。由于该尾部无限深地嵌套,因此不可能决定遵循哪条路径。这就是你的错误信息的源泉。您可以使用一个谓词来说明解析器关于其他路径,例如,

FunctionCall: 
    name=ID =>'(' arg=Atomic ')' 
; 

如果这是不可能的你的使用情况,您可能需要启用回溯,尽管这不推荐。

+0

我试图添加一个谓词作为你的建议,但它仍然会引发递归的致命警告。我认为'FunctionCall'的第二部分作为'MapEntry'的末尾不能被视为下一个开始,因为那样下一个密钥令牌不能被消费。一个例子就像'map {(a)=> f(b)(c)=> d}'。 –