2011-04-12 55 views
19

我目前正在开发一种通用的基于代理的编程语言(它的syntaxt会受到Java的启发,我们也使用这种语言的对象)。Can Xtext可用于解析通用编程语言吗?

自项目开始以来,我们对使用ANTLRXtext的事实怀疑。那时我们发现Xtext正在实现ANTLR的一个子集。所以我们决定使用ANLTR来为我们的语言失去使用我们的语言免费提供完整的Eclipse编辑器的可能性(Xtext提供了这样一个很好的功能)。

但是,据我所知,今年夏天Xtext项目已完成big step forward。从链接引用:

Xtext的局限性是什么?

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

而这也加强在Xtext documentation

什么的Xtext?无论您是想创建小型文本域特定语言(DSL)还是想实现全面的通用编程语言。借助Xtext,您可以快速创建您自己的语言 。另外,如果您已经有一个现有的 语言,但它缺乏像样的工具支持,您可以使用Xtext创建一个基于Eclipse的高级开发环境,该编程体验在现代Java IDE中提供了 编辑体验,其时间极短。我们称Xtext为语言开发框架。

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

在ANTLR网站上,你可以找到吨这样的语法例子,对于所关注的Xtext,而不是只有我能找到的样本是一个文档中的报道。那么Xtext是否仍然不成熟用于实现通用编程语言?我有点担心这个......我不会开始重新写的Xtext语法的,然后认识到,它不适合那个。

回答

14

我认为没有人实现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表达式插入到你的语言。

+0

很高兴有一位Xtext负责人回复我的问题,感谢您的关注。我并没有期望拥有一套完整的工具来处理在Xtext上实现的Java/C++(正如您所说的,没有必要)我正在寻找一些复杂的Xtext语法的很好的例子。对于ANTLR,你会发现许多流行的编程语言语法可以使用。对Xtext来说情况并非如此,所以我想知道是否有可能在Xtext中无缝编写Java语法,因为在其他论坛中,对于以前的Xtext版本,您深深地感到不鼓励人们这样做。 – 2011-04-12 10:01:39

+2

用Xtext实现的编程语言的最好例子是Xtend和Xbase。它的范围已经完全实现,它支持完整的Java.generics和类Scala类型推断。可以在这里找到语法:http://goo.gl/QGR9d和http://goo.gl/7kl23 – 2011-04-12 12:05:41

+0

许多人多谢谢斯文!我会很好的看​​看它!这似乎是一个非常好的测试案例,用于在行动中使用Xtext。我让你知道我的调查结果:) – 2011-04-17 21:01:32

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在这里有很大的不同。

+0

嗨艾拉非常感谢你的回复。链接有误,应该是http://www.semdesigns.com/products/DMS/DMSToolkit.html对不对?不过谢谢参考,我会给它看看。我知道我们将不得不面对你指出的所有问题,我们现在将这本书作为参考http://pragprog.com/titles/tpdsl/language-implementation-patterns。即使你认为ANLR和Xtext没有那么不同,我仍然想知道为什么我无法找到Java和其他语言的Xtext语法,比如ANTLR ... – 2011-04-12 09:10:11

+0

像往常一样,很好的回答Ira!一个小小的挑剔:_“这里ANTLR没有提供AFAIK”_,ANTLR _does_支持使用[StringTemplate](http://www.stringtemplate.org/)发送文本/代码。给定一个AST(或者只是一个简单的分析树),你可以使用ANTLR再次生成源代码,而不必担心缩进和其他手动的输出操作。您必须创建自己的代码模板并在ANTLR语法中混合自定义代码,所以它不像1-2-3那么容易,但仍然有可能。 (对于那些对此感兴趣的人,Google for _“ANTLR输出模板”_) – 2011-04-12 09:17:47

+0

@the_dark_destructor:有一件事,Xtext在表面上看起来相当新颖,需要时间来建立一个真正强大的语言定义库。鉴于他们对Java的关注,我有点惊讶他们没有完整的Java语法;鉴于其新颖性,其他人并不感到惊讶。 – 2011-04-12 09:32:35

0

我想你的问题最简单的答案是:许多通用语言可以使用Xtext实现。但是由于通用语言所需的解析器功能没有普遍的答案,所以对您的问题没有一般的答案。

但是,我有几个要点:

  • 用的Xtext 2.0(今年夏天发布),支持的Xtext语法谓词。如果不启用antlr的回溯,这是处理歧义语法的最多要求的功能之一。

  • 你可能想看看全新的语言Xbase和Xtend,它们(根据它们的能力来判断)是通用的,哪些是使用Xtext开发的。斯文有一些不错的画面投射在他的博客:http://blog.efftinge.de/

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

我猜我的观点是,创建一个语法+设计AST模型+实施范围确定只需要花费更多的精力从语言动物园获取语法并将其转换为Xtext的语法。

心连心, 莫里茨

+1

“多一点”? – 2011-04-12 09:42:12

1

我一直在使用的Xtext了两年,现在实行Umple语言(http://cruise.site.uottawa.ca/umple/)。 Umple是一种通用建模语言,允许开发人员嵌入其他高级编程语言(如Java和PhP)。所以,我需要Xtext来引用其他语言的语法(如Java)。我无法找到用Xtext编写的java语法。交叉引用语法是一个很好的功能,但我不愿意在xtext中重写Java语法。任何想法或帮助表示赞赏。

+0

获得一种工具可以解析嵌入另一个语言中的一种语言,而这种语言已经拥有的语法比获得一个只解析一个你愿意扭曲的语法的工具要困难得多。我们的DMS引擎执行此操作来支持源到源重写规则,规则语法嵌入任意其他语法,并将其预定义到DMS。这就要求我们构建第二个解析引擎来处理相关问题。我不认为你的问题真的是Java语法。 [我非常惊讶于无法为ANTLR cum Xtext找到Java语法)。 – 2011-11-01 15:17:38