如何使用 Xtext 解析带有语义空白的语言?我正在尝试为 CoffeeScript 编写语法,但找不到任何好的文档。
4 回答
这是XText 中对空格敏感的语言示例
AFAIK,你不能。
在解析类似 Python 的语言的情况下,您需要词法分析器来发出INDENT
和DEDENT
标记。为此,您需要在词法分析器规则(Xtext 的terminal
规则)中支持语义谓词,该规则将首先检查输入中下一个字符的 current-position-in-line 是否等于 0(行首)是一个或。' '
'\t'
但是浏览文档,我没有看到 Xtext 目前支持这一点。从 Xtext 2.0 开始,在生产规则中添加了对语义谓词的支持(参见:6.2.8. 语法谓词),但在终端规则中不支持。
使用 Xtext 执行此操作的唯一方法是让词法分析器产生终端空格和换行符,但这会使您的生产规则完全混乱。
如果您想使用 Java(和面向 Java 的解析器生成器)解析这样的语言,我建议您使用 ANTLR,在其中您可以很容易地发出此类INDENT
和DEDENT
令牌。但是,如果您热衷于 Eclipse 集成,那么我看不出您如何使用 Xtext 来做到这一点,抱歉。
Xtext 2.8 版支持Whitespace-Aware Languages。此版本附带“家庭自动化示例”,您可以将其用作模板。
对于对 CoffeeScript 感兴趣的人,Adam Schmideg 有一个使用 XText 的 Eclipse 插件。
对于有兴趣在 XText 中解析类似 Python 的 DSL 的人,上面提到的 Ralf Ebert 的 Todotext 代码不再可从 Github 获得,但您可以在Eclipse 测试存储库中找到它。请参阅有关这项工作的原始线程和有关它的Eclipse 问题。
我今天一直在使用这段代码,我的结论是它不再适用于当前版本的 XText。在 Eclipse 中使用 XText 时,我认为它会进行“部分解析”。这与处理缩进敏感语言所需的有状态词法分析器不兼容。所以我怀疑即使你修补了词法分析器,Eclipse 编辑器也不起作用。在这个问题中,看起来 Ralf 提出了解决这些问题的补丁,但是查看 XText 源代码,这些更改似乎早已不复存在?如果我错了,有人可以让它工作,我会很感兴趣吗?
这里有一个不同的实现,但我也不能让它与当前版本的 XText 一起工作。