MMM*_*MMM 3 eclipse dsl xtext mps
我想问一下 mps 和 xtext 相对于彼此的优势以及编写语言时的主要功能。我知道在使用 mps 时,您直接编辑 AST,而 xtext 使用解析器。我已经阅读了使用 AST 的一个优势,它允许为您正在制作的语言扩展多种语言,我真的不明白这是什么意思,可以进一步解释一下,为什么有人想要扩展多种语言?
我也读过 AST 删除了不明确的代码,它是如何做到的?
我知道 MPS 和 xtext 都具有下划线和突出显示代码等功能,它们是否还有其他与代码验证相关的功能?
欢迎它们的任何其他主要差异和一般特征吗?
我对 Xtext 没有实际经验,所以我将主要谈论 MPS。
Xtext 和 MPS 都是语言工作台,因此它们有自己的模式用于对抽象语法(概念结构)进行元建模,一些定义具体语法的方法(符号)和一些定义生成器的方法(M2M 或 M2T 转换)或更少通常是口译员。然后他们为 IDE 本身提供了突出显示、智能操作,如重构和上下文错误修复、高级搜索和导航(转到声明等)、检查错误(类型错误、静态代码分析、检查定义的约束和规则、检查基数,数据流分析),......所以是的,有很多验证选项。我已经提到了 MPS 中的内容,不确定 Xtext 是否提供了所有内容。但是,所有这些功能都按所谓的方面进行组织您可以在简要描述每个方面的汇总表中查看。
正如您所提到的,MPS 使用投影编辑器。您直接操作 AST,基于解析器的后 IntelliJ 智能 IDE 能够为您提供智能操作,例如重构和转到声明等,因为它们在内存中解析语言并无论如何在幕后构造 AST。投影编辑器跳过解析步骤。
它根本不使用解析器,因此拥有解析器的所有缺点都消失了。首先,语言开发者不需要是语法分析方面的专家,所以你不需要专门聘请他们。但最好的胜利是拥有无限的语言可组合性。正如您所提到的,这是通过完全避免可能出现在语法中的歧义来实现的(MPS 不使用语法,而是使用模型)。假设您使用 languageA
和 language B
。为了演示,假设两种语言都扩展了 BaseLanguage(简称 BL,Java 的 MPS 等价物)并且它们都定义了要记录的语句。概念a
记录到 stderr 并b
记录到文件。但是,这两个a
和b
具有相同的具体语法(即 MPS 中的编辑器定义)只是说log
. 现在,如果您有一个解析器并且它遇到标记,log
则它无法确定该概念来自哪种语言,因此它是模棱两可的 - 即使是前瞻解析器也无法做到。在投影编辑器中这不会发生,因为只有投影是相同的,并且在引擎盖下 AST 有一个a
or的实例b
(你可以认为它总是使用 Java 中类的整个 FQN,只是包隐藏在IDE,因此您可以使用来自不同包的同名类)。“歧义”是在用户写的时候解决的:当他写log
一个下拉菜单时会清楚地显示其中一个是a
,另一个是b
(甚至可能会显示一个描述,上面写着“记录到文件”/“记录到标准错误”)。
因此,MPS 具有很好的语言模块化、可组合性和可扩展性。你提到过
允许为您正在制作的语言扩展多种语言 [...] 为什么有人想要扩展多种语言
你需要区分使用语言和扩展它
(如果你有兴趣更多Völter谈论关于语言的 4 种组合技术:引用、扩展、重用和嵌入)。使用语言只是在其中编写程序的能力。如果你扩展一种语言,它有点像继承,你向它添加新概念,创建一种新类型的 Java (BL) 语句。它也已经用 MPS 附带的标准语言完成了。例如,checkedDots 语言使用.?
空安全操作(类似于?.
C# 中的空条件运算符)扩展了 BL 。那为什么扩展语言?因为您可以使用新的结构,添加新的功能或语法糖。BL 中另一种现成的语言是元组语言,它既有索引元组,也有命名元组。然后是集合语言,它替代了 Java Stream API。所有这些小语言都是扩展,您可以通过简单的 Ctrl+L 开始使用。您还可以将另一种语言嵌入到您的语言中 - 在 Java 代码中的 SQL 语句中使用正则表达式。
MPS 中的另一种语言依赖性是具有“生成目标”语言。MPS 中的生成器的工作方式是将您的语言句子(即模型)转换为另一种 MPS 语言。您可以发明自己的小语言,或实现 LOLcode 并设置生成器以将其转换为有效的 Java 代码。但是,这种语言必须已经存在于 MPS 中,因此如果 MPS 中没有 Python 实现,则无法将其生成到 Python。另一种选择是生成文本 (M2T),这样理论上您可以生成 Python 源代码,或者按原样打印 LOLcode。
投影编辑器与基于解析器的编辑器的第二大区别在于后者本质上仅支持文本符号。也许您可以使用一些外部工具。另一方面,MPS 提供文本、表格、符号(数学符号)和图形(图表)符号。可以根据概念或整个“文件”(程序)将视图从一种表示法转换为另一种表示法。
不过,也不是所有的玫瑰。投影编辑器有一些限制或需要解决的挑战。对投影编辑器中的挑战进行了分析,主要指出可用性和基础设施集成。它们主要在 MPS 中解决,fe 关于基础架构,您有一个很好的 VCS diff/merge 工具。对于自动/cmd 构建,有一种生成 Ant 的语言。Gradle 或 Maven 不直接使用 MPS,而是通过 Ant。关于可用性“MPS 需要一段时间才能适应,但它的可用性与 ParEs 相当。” 3您应该使用一种称为 GrammarCells 的语言(可通过MPS-extensions或mbeddr.platform) 这使得构建好的编辑器变得容易(主要用于算术表达式),否则默认情况下您必须按前缀顺序输入概念(+
首先,而不是数字)。MPS 中的评论不能随意放置。无法建立对不存在节点的引用...(见表 1. 中3)
MPS目前并没有有一个基于Web的版本。不过也有一些计划。Jetbrains 在 WebMPS 上工作,然后是modelix。
通常,您会坚持在 MPS 中工作。默认情况下,它并不是真正可移植的,除非您明确定义生成可移植输出的生成器。如果你想输入一个程序,你可以编写一个粘贴处理程序,你可以把你的解析器放在那里,或者你可以改变 AST 的存储格式(从 XML 到也许直接你的语言,但这又需要一个解析器阅读)。我目前正在研究一种解决方案,该解决方案能够从YAJCo导入 MPS 语言模型(基于模型的解析器生成器,其中输入不是语法,而是表示语义模型的 Java 类)。然后你可以导入一个句子(文件)来创建和填充模型(AST)。如果需要,您可以从 MPS 中的程序生成 Java 源代码,该代码填充原始 Java 类。
顺便说一句,mbeddr 项目已经实现了从 ECore 导入这里检查