Xtext可以用于解析通用编程语言吗?

| 我目前正在开发一种基于通用代理的编程语言(其语法在某种程度上受到Java的启发,并且我们也在该语言中使用对象)。 从项目开始以来,我们就对使用ANTLR或Xtext的事实表示怀疑。那时我们发现Xtext正在实现ANTLR功能的子集。因此,我们决定将ANLTR用于我们的语言,从而失去了免费使用成熟的Eclipse编辑器来支持我们的语言的可能性(Xtext提供了如此出色的功能)。 但是,据我所知,今年夏天Xtext项目向前迈出了一大步。从链接引用:   Xtext的局限性是什么?      Sven:您可以实现几乎任何种类的编程语言或DSL   与Xtext。有一个例外,那就是如果您需要使用   叫做“语义谓词”,这是我相当复杂的事情   不要认为这里不值得解释。真的很少的语言   需要这个概念。但是,最突出的例子是C / C ++。我们想   查看该主题以获取下一个版本。 Xtext文档中也对此进行了增强:   什么是Xtext?无论您是要创建小型文本域专用语言(DSL),还是要实现全面的功能   通用编程语言。使用Xtext,您可以创建自己的   非常自己的语言。另外,如果您已经有一个   语言,但缺乏体面的工具支持,您可以使用Xtext创建   一个基于Eclipse的复杂开发环境,可提供   令人惊讶的是,现代Java IDE提供了丰富的编辑经验   多少时间。我们称Xtext为语言开发框架。 如果Xtext摆脱了过去的局限性,为什么仍然找不到最著名的编程语言(Java,C#等)的复杂Xtext语法呢? 在ANTLR网站上,您可以找到大量这样的语法示例,对于Xtext而言,我能找到的唯一示例就是文档中报告的示例。因此,也许Xtext还不成熟,无法用于实现通用编程语言?我对此感到有点担心...我不会开始用Xtext重写语法,然后才意识到它不适合该语法。     
已邀请:
我认为没有人实现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是什么或做得很好。 根据我们对DMS Software Reengineering Toolkit的经验,我可以说是开发用于处理实际语言的强大工具的问题,我们认为这是一种语言操纵框架。 首先,由于这些语言的历史发展历程,对真实语言的解析通常在词法分析和/或解析中涉及一些麻烦。 Java很干净。 C#具有上下文相关的关键字和类似于C \的基本预处理器。 C具有完整的预处理器。由于语法和模板语法的含糊不清,C ++众所周知“很难解析”。 COBOL非常丑陋,没有任何参考语法,并且有多种方言。如果您对PHP进行定义,那么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在这里有很大不同。     
我看到Clojure有一个Xtext语法,还有一些有关体验的2010年7月幻灯片。     
我已经使用Xtext两年了,以实现Umple语言(http://cruise.site.uottawa.ca/umple/)。 Umple是一种通用建模语言,允许开发人员嵌入其他高级编程语言(如Java和PhP)。因此,我需要Xtext才能引用其他语言的语法(即Java)。我找不到用Xtext编写的Java语法。交叉引用语法是一个不错的功能,但是我不愿意沿用xtext重写Java语法的方法。任何想法或帮助表示赞赏。     
我想您的问题最简单的答案是:可以使用Xtext实现许多通用语言。但是,由于没有通用语言需要哪种解析器功能的通用答案,因此也就没有通用的答案。 但是,我有几点建议: 在Xtext 2.0(今年夏天发布)中,Xtext支持语法谓词​​。这是在不启用antlr的回溯的情况下处理歧义语法的最常用功能之一。 您可能需要查看全新的语言Xbase和Xtend,它们是通用的(基于它们的功能来判断),并且是使用Xtext开发的。 Sven在他的博客中提供了一些不错的屏幕投射:http://blog.efftinge.de/ 关于您的问题,为什么我们看不到Java,C ++等的Xtext语法: 使用Xtext,语言不仅仅是语法,因此仅具有描述语言语法的语法是一个很好的起点,但通常不是足够有价值的工件。原因是,使用Xtext语法,您还定义了包含真实交叉引用的AST \的结构(实际上是抽象语法树和Ecore模型)。由于此模型是您语言的主要内部API,因此人们通常会花很多时间来设计它。此外,要解决交叉引用(也称为链接),您需要实现作用域(在Xtext中被称为)。如果没有适当地进行范围界定,您将无法在模型中拥有真正的交叉引用,否则会遇到许多衬砌错误。 我的猜测是,创建语法+设计AST模型+实现作用域仅比从某种语言动物园获取语法并将其转换为Xtext的语法要付出更多的努力。 hth,   莫里兹     

要回复问题请先登录注册