【问题标题】:Left recursive rules of XtextXtext的左递归规则
【发布时间】:2014-02-10 02:03:41
【问题描述】:

我在 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中是否有一些关于左递归的隐含规则?

谢谢。

【问题讨论】:

    标签: recursion antlr grammar xtext


    【解决方案1】:

    您的Map 包含以Atomic 结尾的MapEntrys 列表。 Atomic 又是 FunctionCall 或普通的 ID。不过,FunctionCall 的尾部看起来像下一个 MapEntry 的开头。由于那条尾巴是无限深嵌套的,因此无法决定要遵循哪条路径。这就是您的错误消息的来源。您可以使用谓词来说服解析器关于 on 或其他路径,例如

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

    如果您的用例无法做到这一点,您可能希望启用回溯,但不建议这样做。

    【讨论】:

    • 我尝试添加一个谓词作为您的建议,但它仍然会引发致命的递归警告。我认为FunctionCall 的第二部分作为MapEntry 的结尾不能被视为下一个开始,因为这样就不能消耗下一个密钥令牌。例如map { (a) => f(b) (c) => d }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多