首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xtext的左递归规则

Xtext的左递归规则
EN

Stack Overflow用户
提问于 2014-02-10 10:03:42
回答 1查看 251关注 0票数 0

我在Xtext中遇到了一个递归规则问题。简化后的版本如下:

代码语言:javascript
复制
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给出了这个错误消息:

代码语言:javascript
复制
[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中是否有一些关于左递归的隐式规则?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2014-02-10 15:28:16

You Map包含一个以Atomic结尾的MapEntry列表。反过来,Atomic可以是FunctionCall,也可以是普通ID。不过,FunctionCall的尾部看起来像是下一个MapEntry的开始。由于该尾部嵌套得非常深,因此无法确定要遵循哪条路径。这就是你的错误信息的来源。您可以使用一个谓词来说服解析器关于on或other path to go,例如

代码语言:javascript
复制
FunctionCall:
  name=ID =>'(' arg=Atomic ')' 
;

如果这对于您的用例是不可能的,那么您可能想要启用回溯,尽管不推荐这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21667907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档