【发布时间】:2020-08-15 19:11:40
【问题描述】:
几个小时前我刚刚开始阅读有关 DSL 建模的内容。
但是现在,我使用 JetBrains MPS IDE 或它的 JetBrains Intellij Idea 插件,我想知道如何将这些 DSL 模型导出到可用的东西,例如控制台应用程序或其他任何东西(以防万一或有意义)。
【问题讨论】:
几个小时前我刚刚开始阅读有关 DSL 建模的内容。
但是现在,我使用 JetBrains MPS IDE 或它的 JetBrains Intellij Idea 插件,我想知道如何将这些 DSL 模型导出到可用的东西,例如控制台应用程序或其他任何东西(以防万一或有意义)。
【问题讨论】:
您可以在 MPS 中做几件事,而无需导出模型:
如果您希望从 MPS 导出数据以用于不同的应用程序,我会采用两种方法 推荐:
NodeSerializer。我有更多关于如何在blog post 中使用它的详细信息。这可以让您以相当不错的 XML 结构快速导出数据。您可以考虑以下两种方法,但我会不推荐:
直接访问模型 (*.mps) 文件。虽然它们已经是 XML 格式,但它们的结构已适应
MPS 的需求。它是规范化的,这意味着给定的信息通常只存储一次,并且它也
以特定方式对节点 ID 进行编码以节省空间。格式也没有记录,将来可能会改变
(尽管过去几年没有改变)。
使用 MPS 生成器将您的 DSL 转换为 MPS 的内置 XML 语言 jetbrains.mps.core.xml。我不推荐使用 MPS 生成器,因为生成器的最佳位置是在两种不同的 MPS 语言之间进行翻译,例如从您的自定义 DSL 到 Java。如果您尝试编写生成器规则来将任何内容转换为 XML,您会遇到一些可以克服但完全没有必要的问题。
【讨论】:
您可以定义一个生成器,将您的语言的句子(文件、AST)转换为另一种 MPS 语言。目标语言必须首先存在于 MPS 中。
或者,您可以使用 TextGen 方面生成文本,但这更适合仅打印您的语言的文本表示。如果您想要更复杂的东西(例如生成另一种语言的文本代码),您可以使用来自MPS-extensions 或mbeddr.platform 的plaintextgen 语言。
如果您想将文本程序输入(导入)到 MPS ,您可以编写 paste handler 来放置解析器,或者您可以更改存储 AST 的格式(从 XML 到可能直接是您的语言,但这需要解析器才能读取)custom persistence。
我目前正在研究solution,它可以从YAJCo 模型(基于模型的解析器生成器,其中输入不是语法,而是代表语义模型的Java 类)导入MPS 语言。然后,您可以导入一个创建和填充模型 (AST) 的句子(文件)。从 MPS 中的程序,您可以生成填充原始 Java 类的 Java 源代码。因此,如果您想要一种文本 MPS 语言并使用 IDE,然后将 AST 导出为您可以使用的 Java 对象,那么 YtM 可能适合您。
【讨论】: