4

我想问一下 mps 和 xtext 的优势以及编写语言时的主要功能。我知道在使用 mps 时,您正在直接编辑 AST,而 xtext 使用解析器。我已经阅读了使用 AST 的优势,允许为您正在制作的语言扩展多种语言,我真的不明白这意味着什么,可以进一步解释,为什么有人想要扩展多种语言?

我也读过 AST 删除了模棱两可的代码,它是如何做到的?

我知道 MPS 和 xtext 都具有下划线和突出显示代码之类的功能,它们是否还有其他与代码验证相关的功能?

欢迎他们的任何其他主要区别和一般特征?

4

1 回答 1

7

我没有 Xtext 的实践经验,所以我将主要谈论 MPS。

轻量化

Xtext 和 MPS 都是语言工作台,因此它们有自己的模式用于对抽象语法(概念结构)进行元建模,以某种方式定义具体语法(符号)和某种方式来定义生成器(M2M 或 M2T 转换)或更少通常是口译员。然后他们为 IDE 本身提供了突出显示、智能操作,如重构和上下文错误修复、高级搜索和导航(转到声明等)、检查错误(类型错误、静态代码分析、检查定义的约束和规则、检查基数,数据流分析),......所以是的,有很多验证选项。我已经提到了 MPS 中的东西,不确定 Xtext 是否提供了一切。然而,所有这些特征都被组织在所谓的方面您可以在简要描述每个方面的汇总表中查看。

投影编辑器

正如您所提到的,MPS 使用投影编辑器。您直接操作 AST,基于解析器的 post-IntelliJ 智能 IDE 能够为您提供智能操作,如重新定义和去声明等,只是因为它们解析内存中的语言并在幕后构建 AST。投影编辑器跳过解析步骤。

避免歧义

它根本不使用解析器,因此拥有解析器的所有缺点都消失了。首先,语言开发人员不需要是语法分析方面的专家,所以你不需要专门聘请他们。但最好的胜利是拥有无限的语言可组合性。正如您所提到的,这是通过完全避免可能出现在语法中的歧义来实现的(MPS 不使用语法,而是使用模型)。假设您使用语言A和语言B。为了演示,假设这两种语言都扩展了 BaseLanguage(缩写为 BL,Java 的 MPS 等效项),并且它们都定义了要记录的语句。概念a记录到标准错误并b记录到文件。然而,两者ab具有相同的具体语法(即 MPS 中的编辑器定义)只是说log. 现在,如果您有一个解析器并且它遇到令牌log,它无法确定该概念来自哪种语言,因此它是模棱两可的——即使是前瞻解析器也无法做到。在投影编辑器中,这不可能发生,因为只有投影是相同的,并且在引擎盖下 AST 有一个a或的实例b(你可以认为它总是使用 Java 中类的整个 FQN,只是包隐藏在IDE,因此您可以使用来自不同包的同名类)。用户在写作时解决了“歧义”:当他写作时,会log出现一个下拉菜单,清楚地显示其中一个是a,另一个是b(甚至可能显示“记录到文件”/“记录到标准错误”的描述)。

模块化

因此,MPS 具有很好的模块化、可组合性和语言的可扩展性。你提到过

允许为您正在制作的语言扩展多种语言 [...] 为什么有人要扩展多种语言

你需要区分使用语言和扩展它 (如果你感兴趣的话,Völter会谈到关于语言的 4 种组合技术:引用、扩展、重用和嵌入)。使用语言只是在其中编写程序的能力。如果你扩展一种语言,它有点像继承,你向它添加新概念,fe 创建一种新类型的 Java (BL) 语句。它也以 MPS 附带的标准语言完成。例如,您有 checkDots 语言,它使用.?空安全操作(类似于?.C# 中的空条件运算符)扩展了 BL。那为什么扩展语言?因为您可以使用新结构、添加新功能或语法糖。BL 中另一种即用型语言是元组语言,它既有索引元组又有命名元组。然后是集合语言,它取代了 Java Stream API。所有这些小语言都是扩展,您可以通过简单的 Ctrl+L 开始使用。您还可以在您的语言中嵌入另一种语言 - 在 Java 代码中的 SQL 语句中使用正则表达式。

一代

MPS 中的另一种语言依赖性是具有“生成目标”语言。MPS 中的生成器的工作方式是将您的语言句子(即模型)转换为另一种 MPS 语言。您可以发明自己的小语言,或实现 LOLcode 并设置生成器以将其转换为有效的 Java 代码。但是,这种语言必须已经存在于 MPS 中,因此如果 MPS 中没有 Python 实现,则无法将其生成到 Python。另一种选择是生成文本 (M2T),这样理论上你可以生成 Python 源代码,或者直接打印 LOLcode。

多种符号

投影编辑器与基于解析器的编辑器的第二个重大区别是后者固有地仅支持文本符号。也许您可以使用一些外部工具。另一方面,MPS 提供文本、表格、符号(数学符号)和图形(图表)符号。有可能根据概念或整个“文件”(程序)将您的视图从一种符号交换到另一种符号。

缺点

但这并不全是玫瑰。投影编辑器有一些限制或需要解决的挑战。对投影编辑器的挑战进行了分析,主要指出了可用性基础设施集成。它们主要在 MPS 中解决,对于基础架构,你有一个很好的 VCS diff/merge 工具。对于自动/cmd 构建,有一种生成 Ant 的语言。Gradle 或 Maven 不能直接使用 MPS,而是通过 Ant。关于可用性“MPS 需要一段时间来适应,但其可用性与 ParE 相当。” 3您应该使用一种称为 GrammarCells 的语言(可通过MPS-extensionsmbeddr.platform) 这使得构建良好的编辑器变得容易(主要用于算术表达式),否则默认情况下您必须按前缀顺序输入概念(+首先,而不是数字)。MPS 中的评论不能随意放置。无法建立对不存在节点的引用...(参见表 1. in 3

MPS 目前没有基于Web版本。不过,也有一些计划。Jetbrains 在 WebMPS 上工作,然后是modelix

可移植性

通常,您只能在 MPS 中工作。默认情况下,它不是真正可移植的,除非您明确定义产生可移植输出的生成器。如果你想输入一个程序,你可以编写一个粘贴处理程序,你可以在其中放置你的解析器,或者你可以改变存储 AST 的格式(从 XML 到可能直接你的语言,但这又需要一个解析器读书)。我目前正在研究一种能够从YAJCo导入 MPS 语言的解决方案模型(基于模型的解析器生成器,其中输入不是语法,而是表示语义模型的 Java 类)。然后,您可以导入一个创建和填充模型 (AST) 的句子(文件)。如果需要,您可以从 MPS 中的程序生成填充原始 Java 类的 Java 源代码。

顺便说一句,mbeddr 项目已在此处实施从 ECore 导入检查

字典

  • M2M = 模型到模型
  • M2T = 模型到文本
于 2020-08-13T18:18:08.617 回答