19

我目前正在开发一种通用的基于代理的编程语言(它的语法会受到 Java 的启发,我们也在这种语言中使用对象)。

自项目开始以来,我们对使用ANTLRXtext的事实持怀疑态度。那时我们发现 Xtext 正在实现 ANTLR 功能的一个子集。所以我们决定为我们的语言使用 ANLTR,从而失去了为我们的语言免费拥有一个成熟的 Eclipse 编辑器的可能性(Xtext 提供了如此好的特性)。

然而,据我所知,今年夏天 Xtext 项目向前迈出了一大步。引用链接:

Xtext 的限制是什么?

Sven:您可以使用 Xtext 实现几乎任何类型的编程语言或 DSL。有一个例外,那就是如果您需要使用所谓的“语义谓词”,这是一件相当复杂的事情,我认为不值得在这里解释。很少有语言真正需要这个概念。然而,突出的例子是 C/C++。我们希望在下一个版本中研究该主题。

这在Xtext 文档中也得到了加强:

什么是 Xtext?无论您是想创建一种小型的文本领域特定语言 (DSL),还是想实现一种成熟的通用编程语言。使用 Xtext,您可以快速创建自己的语言。此外,如果您已经拥有一种现有的语言,但它缺乏良好的工具支持,那么您可以使用 Xtext 创建一个复杂的基于 Eclipse 的开发环境,在极短的时间内提供现代 Java IDE 中已知的编辑体验。我们称 Xtext 为语言开发框架。

如果 Xtext 摆脱了过去的限制,为什么仍然无法为最著名的编程语言(Java、C# 等)找到复杂的 Xtext 语法?

在 ANTLR 网站上,您可以找到大量此类语法示例,而对于 Xtext 而言,我能找到的唯一示例是文档中报告的示例。那么,也许 Xtext 仍然不成熟,无法用于实现通用编程语言?我对此有点担心......我不会开始在 Xtext 中重写语法,然后认识到它不适合那个。

4

3 回答 3

16

我认为没有人实现 Java 或 C++,因为它需要大量工作(即使使用 Xtext),并且现有的工具和编译器都非常出色。但是,您可以看看 Xbase 和 Xtend,这是我们随 Xtext 提供的表达式语言。它是用 Xtext 构建的,并且很好地证明了您可以用 Xtext 构建什么。我们在大约 4 个人月内完成了这项工作。

我在 Xtend 上做了几个截屏视频:

http://blog.efftinge.de/2011/03/xtend-screencast-part-1-basics.html
http://blog.efftinge.de/2011/03/xtend-screencast-part-2-switch.html
http://blog.efftinge.de/2011/03/xtend-screencast-part-3-rich-strings-ie.html

请注意,您可以简单地将 Xbase 表达式嵌入到您的语言中。

于 2011-04-12T09:22:49.587 回答
3

我不能说 Xtext 是什么或做得很好。

根据我们对DMS Software Reengineering Toolkit的经验,我可以谈谈开发用于处理真实语言的强大工具的问题,我们认为它是一个语言操作框架。

首先,由于这些语言的历史演变方式,真实语言的解析通常涉及词法分析和/或解析中的一些混乱。Java非常干净。C# 具有上下文相关的关键字和类似于 C 的基本预处理器。C 有一个成熟的预处理器。由于语法的歧义和模板语法的恶作剧,C++ 以“难以解析”而著称。COBOL 相当丑陋,没有任何参考语法,并且有多种方言。如果你看它,PHP 会让你变成石头,因为它的定义太差了。(DMS 对所有这些都有解析器,用于对实际应用程序的愤怒)。

然而,如果你足够努力,你可以使用大多数可用的解析技术来解析所有这些,通常是通过滥用词法分析器或解析器来实现你的目标(GNU 家伙如何通过将词法分析与符号表查找纠缠在一起来滥用 Bison 来解析 C++是一个很好的丑陋案例)。但是要获得正确的语言细节需要付出很多努力,并且参考手册只是编译器真正接受的事实的近似值。

如果 Xtext 有一个不错的解析引擎,那么很可能使用 Xtext 来做到这一点。对 Xtext 站点的简短阅读听起来像是词法分析器和解析器相当不错。我没有看到任何关于“语义谓词”的信息;我们在 DMS 中有它们,它们是解析的一些真正黑暗角落的救星。即使使用非常好的解析技术(我们使用 GLR 解析器),如果没有它们,也很难解析 COBOL 数据声明(在解析期间提取它们的嵌套结构)。

你有一个有趣的问题,你的语言还没有很好地定义。这将使您的初始解析器有些混乱,并且您将对其进行大量修改。这就是强大的解析技术可以帮助您的地方:如果您可以轻松地修改您的语法,您就可以专注于您希望您的语言看起来像什么,而不是专注于与词法分析器和解析器作斗争。您可以更改语言定义的事实意味着事实上,如果 Xtext 有一些限制,您可能可以调整语言语法以匹配而不会产生巨大的痛苦。ANTLR 确实具有经过验证的能力来解析一种语言,就像你想象的那样,以通常的解析器黑客攻击量为模。

从未讨论过的是真正处理语言还需要什么。您需要能够做的第一件事是构建 AST,ANTLR 和 YACC 将帮助您完成;我想 Xtext 也可以。您还需要符号表、控制和数据流分析(本地和全局),以及将您的语言转换为其他东西(可能更可执行)的机器。只做符号表你会发现非常困难;C++有几百页的“如何查找标识符”;Java 泛型比你想象的要困难得多。如果您想提供重构,您可能还想将 AST 漂亮地打印回源代码。(编辑:这里 ANTLR 和 Xtext 都提供了相当于文本模板驱动的代码生成)。

然而,这些都是复杂的机制,即使不超过构建解析器,也需要花费同样多的时间。DMS 存在的原因不是因为它可以解析(我们认为这就像扑克游戏中的赌注),而是因为所有这些其他的东西都非常困难,我们想分摊做这一切的成本(DMS 有,我们认为,除了 YMMV 之外,对所有这些机制都有很好的支持)。

在阅读 Xtext 概述时,听起来他们对符号表有一些支持,但不清楚背后是什么样的假设(例如,对于 C++,您必须支持多重继承和命名空间)。

如果您已经开始走 ANTLR 道路并且有一些东西正在运行,我会很想坚持下去;我怀疑 Xtext 是否会为您提供很多额外的帮助。如果您真的想要 Xtext 的编辑器,那么您可能会以重构您拥有的语法为代价进行切换(这是更改解析范例时要付出的非常典型的代价)。预计您的大部分工作都会在您正确解析解析器后以一种特别的方式出现。我怀疑您会在这里发现 Xtext 或 ANTLR 大不相同。

于 2011-04-12T08:40:25.893 回答
0

我想对您的问题最简单的答案是:许多通用语言都可以使用 Xtext 实现。但是由于没有通用语言需要哪些解析器功能的通用答案,因此您的问题没有通用答案。

不过,我有几点建议:

  • 在 Xtext 2.0(今年夏天发布)中,Xtext 支持语法谓词​​。这是在不启用 antlr 回溯的情况下处理歧义语法的最需要的功能之一。

  • 您可能想看看全新的语言 Xbase 和 Xtend,它们(根据它们的能力判断)是通用的,并且是使用 Xtext 开发的。Sven 在他的博客中有一些不错的屏幕投射:http ://blog.efftinge.de/

关于您的问题,为什么我们看不到用于 Java、C++ 等的 Xtext-grammars:使用 Xtext,语言不仅仅是一种语法,因此只有一个描述语言语法的语法是一个很好的起点,但通常不是一件足以运输的神器。原因在于,使用 Xtext 语法,您还可以定义 AST 的结构(实际上是抽象语法树和 Ecore 模型),包括真正的交叉引用。由于这个模型是你的语言的主要内部 API,人们通常会花很多心思来设计它。此外,要解决交叉引用(也称为链接),您需要实现范围界定(在 Xtext 中调用它)。如果没有正确实施范围界定,您的模型中可能没有真正的交叉引用,或者您会得到许多衬里错误。

我的一个猜测是,创建语法 + 设计 AST 模型 + 实施范围只是比从一些语言动物园中获取语法并将其翻译成 Xtext 的语法多一点努力。

于 2011-04-12T09:37:21.583 回答