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