如何使用Xtext解析具有语义空白的语言?我正在尝试为CoffeeScript编写语法,但我找不到任何好的文档。
答案 0 :(得分:17)
以下是XText中的示例whitespace sensitive language
答案 1 :(得分:4)
AFAIK,你不能。
如果要解析类似Python的语言,则需要词法分析器发出INDENT
和DEDENT
个令牌。要实现这一点,您需要在词法分析器规则(Xtext的terminal
规则)中支持语义谓词,这将首先检查输入中下一个字符的当前位置是否等于0(行的开头)和是' '
或'\t'
。
但浏览documentation,我不认为此刻Xtext支持这一点。自Xtext 2.0以来,为生产规则中的语义谓词添加了支持 (参见: 6.2.8。语法谓词),但终端规则中没有。
使用Xtext执行此操作的唯一方法是让词法分析器生成终端空格和换行符,但这会使您的生产规则完全混乱。
如果你想用Java(和面向Java的解析器生成器)解析这样的语言,我建议使用ANTLR,你可以 发出这样的INDENT
和{{1} }令牌非常容易。但是如果你热衷于Eclipse集成,那么我不知道你怎么能用Xtext做到这一点,抱歉。
答案 2 :(得分:3)
Xtext 2.8版本支持Whitespace-Aware Languages。此版本附带"家庭自动化示例"你可以用作模板。
答案 3 :(得分:2)
对于对CoffeeScript感兴趣的人,Adam Schmideg有Eclipse plugin that uses XText。
对于有兴趣在XText中解析类似Python的DSL的人来说,Github不再提供上面提到的Ralf Ebert的Todotext代码,但你可以在Eclipse test repository中找到它。请参阅有关此工作的original thread以及有关此工作的Eclipse issue。
我今天一直在玩这个代码,我的结论是它不再适用于当前版本的XText。当在Eclipse中使用XText时,我认为它确实是“部分解析”。这与处理缩进敏感语言所需的有状态词法分析器不兼容。所以我怀疑即使你修补词法分析器,Eclipse编辑器也行不通。在这个问题中,看起来Ralf提出了解决这些问题的补丁,但是在研究XText源代码时,这些变化似乎早已不复存在?如果我错了,有人可以让它上班,我会非常感兴趣吗?
有一个不同的实现here,但我无法使用当前版本的XText。
相反,我已切换到支持parboiled框的indentation based grammars。