Xtext能够用于解析通用编程语言吗?

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重新编写语法,然后发现它不适合那个用途。

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表达式嵌入到你的语言中。


很高兴能够得到Xtext主管之一的回复,感谢您的关注。我并没有期望在Xtext上实现完整的Java/C++工具套件(正如您所说,这是没有必要的)。我正在寻找一些复杂的Xtext语法的好例子。对于ANTLR,你会发现有很多流行的编程语言语法可以直接使用。但是对于Xtext来说情况并非如此,因此我想知道是否可能无缝地在Xtext中编写Java语法,因为在其他论坛中,以前版本的Xtext深深地劝阻人们不要这样做。 - the_dark_destructor
2
使用Xtext实现的编程语言最好的例子是Xtend和Xbase。它的作用域完全实现,支持完整的Java泛型和类似于Scala的类型推断。语法可以在这里找到:http://goo.gl/QGR9d和http://goo.gl/7kl23。 - Sven Efftinge
非常感谢Sven!我会好好看看的!这似乎是一个真正能够展示Xtext实际应用的好测试案例。我会告诉你我的调查结果 :) - the_dark_destructor
1
过了一段时间后,我可以说:是的,它可以做到,并且非常无缝。Xtext 是一个非常棒的工具。感谢你的所有工作,Sven! - the_dark_destructor

3

我不能代表Xtext是什么或做得好的方面。

根据我们使用DMS软件重构工具包的经验,我可以谈论开发处理真实语言的强大工具的问题,这是我们想象中的语言操作框架。

首先,真实语言的解析通常涉及到词法分析和/或语法分析中的混乱情况,这是由于这些语言的历史演变方式造成的。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对所有这些机制都有很好的支持,但您的经验可能有所不同)。
阅读Xtext概述,听起来他们对符号表有一些支持,但不清楚背后的假设是什么(例如,对于C ++,您必须支持多重继承和名称空间)。
如果您已经开始使用ANTLR并且有一些运行中的内容,我会建议继续前进;我怀疑Xtext将为您提供很多额外的帮助。如果您真的非常想要Xtext的编辑器,那么您可能可以付出重组语法的代价来实现切换(这是更改解析范例时要付出的相当典型的代价)。预计大部分工作将在您正确获取解析器之后以一种特定方式出现。我认为您在这方面不会发现Xtext或ANTLR有太大的不同。

嗨,Ira,非常感谢您的回复。链接是错误的,应该是http://www.semdesigns.com/products/DMS/DMSToolkit.html,对吧?不过还是感谢您提供的参考,我会去看一下的。我知道我们将不得不面对您指出的所有问题,我们现在以这本书作为参考http://pragprog.com/titles/tpdsl/language-implementation-patterns。即使您认为ANLR和Xtext并没有太大的区别,我仍然想知道为什么我找不到Java和其他语言的Xtext语法,就像在ANLR的情况下一样... - the_dark_destructor
很好的回答Ira,像往常一样!不过有一个小问题:“在我所知道的范围内,ANTLR没有提供任何东西”,ANTLR确实支持使用StringTemplate来发出文本/代码。给定AST(或仅是简单的解析树),您可以使用ANTLR再次生成源代码,而无需担心缩进和其他手动费力的输出操作。您将不得不创建自己的代码模板并在ANTLR语法中混合自定义代码,因此它不像1-2-3那么容易,但仍然是可能的。(对于那些对此感兴趣的人,请搜索“ANTLR输出模板”) - Bart Kiers
@the_dark_destructor:首先,Xtext显然是比较新的,建立真正强大的语言定义库需要时间。考虑到他们专注于Java,我有点惊讶他们没有完整的Java语法;其他方面可以理解因为它很新。 - Ira Baxter
@Bart Kiers:感谢您的澄清,我甚至从自己的答案中学到了新东西 :-} 我已经修改了我的答案以考虑您的观察。 - Ira Baxter

0

我猜你问题的最简单答案是:许多通用编程语言都可以使用Xtext实现。但由于没有通用的回答来回答一个通用编程语言需要哪些解析器功能,所以也就没有通用的回答来回答你的问题。

然而,我有一些指针:

  • 使用Xtext 2.0(今年夏天发布),Xtext支持语法谓词。这是处理模棱两可的语法而不启用antlr回溯的最常请求的功能之一。

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

关于您的问题,为什么我们没有看到Java、C++等语言的Xtext语法: 使用Xtext,一门语言不仅仅是一个语法,因此仅有描述语言语法的语法是一个很好的起点,但通常不足以用于发布。原因在于,使用Xtext-grammar,您还可以定义AST(抽象语法树)结构(实际上是Ecore模型),包括真正的交叉引用。由于该模型是语言的主要内部API,人们通常会花费大量时间来设计它。此外,为了解决交叉引用(也称为链接),您需要实现作用域(在Xtext中称为作用域)。如果没有适当的作用域实现,您要么无法在模型中具有真正的交叉引用,要么会出现许多连接错误。
我想我的观点是,创建语法+设计AST模型+实现作用域只比从某个语言库中获取语法并将其转换为Xtext语法稍微费力一点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接