1

几个小时前,我刚刚开始阅读有关 DSL 建模的内容。

但是现在,我与使用 JetBrains MPS IDE 或它的 JetBrains Intellij Idea 插件有关,我想知道如何将这些 DSL 模型导出到可用于控制台应用程序或其他任何东西的东西(以防万一可能或有意义)。

4

2 回答 2

2

您可以定义一个生成器,将您的语言的句子(文件、AST)转换为另一种 MPS 语言。目标语言必须首先存在于 MPS 中。

或者,您可以使用 TextGen 方面生成文本,但这更适合仅打印您的语言的文本表示。如果你想要更复杂的东西(比如生成另一种语言的文本代码),你可以使用MPS-extensionsmbeddr.platform中的plaintextgen语言。

如果您想将文本程序输入(导入)到 MPS中,您可以编写一个粘贴处理程序,您可以在其中放置您的解析器,或者您可以更改存储 AST 的格式(从 XML 到可能直接是您的语言,但这将再次需要解析器来读取)具有自定义持久性

我目前正在研究一种解决方案,该解决方案能够从YAJCo模型(基于模型的解析器生成器,其中输入不是语法,而是代表语义模型的 Java 类)导入 MPS 语言。然后,您可以导入一个创建和填充模型 (AST) 的句子(文件)。从 MPS 中的程序,您可以生成填充原始 Java 类的 Java 源代码。因此,如果您想要一种文本 MPS 语言并使用 IDE,然后将 AST 导出为您可以使用的 Java 对象,那么 YtM 可能适合您。

于 2020-08-13T18:27:51.807 回答
2

您可以在 MPS 中执行几项操作,而无需导出模型:

  • 分析模型以检查错误、违反业务规则或不一致的情况。
  • 解释模型,然后直接在 MPS 中显示解释结果。例如,如果您实现规范和该规范的示例/测试,那么您可以在 MPS 中运行测试并将结果显示为绿色/红色突出显示。
  • 定义一个生成器以将模型转换为文本(例如 Liquibase 等工具的可执行代码或输入,以创建数据库模式)。

如果您希望从 MPS 导出数据以用于不同的应用程序,我建议您使用两种方法:

  1. 最简单的方法:NodeSerializer来自 MPS 扩展。我有更多关于如何在博客文章中使用它的详细信息。这使您可以以相当不错的 XML 结构快速导出数据。
  2. 最灵活的方法:编写自定义导出器,使用MPS Open API递归遍历节点树。您可以输出您想要的任何格式(XML、JSON、YAML 等)并根据需要自定义输出。

以下是您可以考虑的另外两种方法,但我推荐:

  1. 直接访问模型 ( *.mps) 文件。虽然它们已经是 XML 格式,但它们的结构已适应 MPS 的需要。它是规范化的,这意味着给定的信息通常只存储一次,并且它还以特定方式对节点 ID 进行编码以节省空间。该格式也没有记录,将来可能会改变(尽管过去几年没有改变)。

  2. 使用 MPS 生成器将您的 DSL 转换为 MPS 的内置 XML 语言,jetbrains.mps.core.xml. 我不推荐使用 MPS 生成器,因为生成器的最佳位置是在两种不同的 MPS 语言之间进行转换,例如从您的自定义 DSL 到 Java。如果您尝试编写生成器规则来将任何内容转换为 XML,您会遇到一些可以克服但完全没有必要的问题。

于 2020-08-14T07:08:13.743 回答