我目前正在开发一种基于代理的通用编程语言(它的语法受到Java的启发,我们也使用这种语言的对象)。
自项目开始以来,我们怀疑使用ANTLR或Xtext的事实。那时我们发现Xtext正在实现ANTLR功能的一个子集。所以我们决定在我们的语言中使用ANLTR,失去了为我们的语言免费提供一个完整的Eclipse编辑器的可能性(这是Xtext提供的一个很好的功能)。
然而,据我所知,今年夏天Xtext项目已经完成了big step forward。引用链接:
也加强了这一点Xtext有哪些限制?
Sven:您可以实现几乎任何类型的编程语言或DSL 用Xtext。有一个例外,那就是你需要使用它 称为“语义谓词”,这是一件相当复杂的事情 不认为值得在这里解释。真的很少有语言 需要这个概念。然而,突出的例子是C / C ++。我们想 在下一个版本中查看该主题。
什么是Xtext?无论您是想创建一个小的文本域特定语言(DSL)还是想要实现全面的语言 通用编程语言。使用Xtext,您可以创建自己的 非常自己的语言。如果你已经有了 语言,但它缺乏体面的工具支持,你可以使用Xtext来创建 一个复杂的基于Eclipse的开发环境提供 现代Java IDE中的编辑经验非常简短 多少时间。我们称Xtext为语言开发框架。
如果Xtext已经摆脱了过去的限制,为什么仍然无法为最知名的编程语言(Java,C#等)找到复杂的Xtext语法?
在ANTLR网站上,您可以找到大量此类语法示例,对于Xtext而言,我能够找到的唯一示例是文档中报告的示例。也许Xtext仍然不成熟,无法用于实现通用编程语言?我有点担心这个...我不会开始在Xtext中重写语法,然后才能认识到它不适合那个。
答案 0 :(得分:15)
我认为没有人实现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表达式嵌入到您的语言中即可。
答案 1 :(得分:3)
我无法代表Xtext是什么或做得好。
我可以根据我们对DMS Software Reengineering Toolkit的经验来讨论开发用于处理真实语言的强大工具的问题,我们认为这是一种语言操作框架。
首先,由于这些语言的历史发展方式,实际语言的解析通常涉及到lexing和/或解析中的一些混乱。 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在这里有很大不同。
答案 2 :(得分:2)
答案 3 :(得分:1)
我已经使用Xtext两年来实现Umple语言(http://cruise.site.uottawa.ca/umple/)。 Umple是一种通用建模语言,允许开发人员嵌入其他高级编程语言(如Java和PhP)。所以,我需要Xtext能够引用其他语言语法(即Java)。我无法找到用Xtext编写的java语法。交叉引用语法是一个很好的功能,但我不愿意在xtext中重写Java语法。任何想法或帮助表示赞赏。
答案 4 :(得分:0)
我想你问题最简单的答案是:许多通用语言都可以使用Xtext实现。但由于对于通用语言所需的解析器功能没有一般性的答案,因此对您的问题没有一般性的答案。
但是,我有一些指示:
使用Xtext 2.0(今年夏天发布),Xtext支持语法谓词。这是在不启用antlr的回溯的情况下处理模糊语法的最需要的功能之一。
您可能希望了解全新的语言Xbase和Xtend,它们(根据其功能判断)是通用的,并且是使用Xtext开发的。 Sven在他的博客中有一些不错的屏幕演员:http://blog.efftinge.de/
关于你的问题,为什么我们没有看到Java,C ++等的Xtext-grammars: 使用Xtext,语言不仅仅是一种语法,因此只需要一个描述语言语法的语法就是一个很好的起点,但通常不是一个足以运输的工具。原因是使用Xtext-grammar还可以定义AST的结构(抽象语法树,实际上是Ecore模型),包括真正的交叉引用。由于这个模型是你语言的主要内部API,人们通常会花很多时间去设计它。此外,要解决交叉引用(也称为链接),您需要实现作用域(在Xtext中调用)。如果没有正确实施范围,您可以在模型中没有真正的交叉引用,否则会出现很多衬里错误。
我的观点是,创建一个语法+设计AST模型+实现范围设计只需要花费一些语言动物园的语法并将其转换为Xtext的语法。
HTH, Moritz的