【问题标题】:What can I do with DSL languages generated inside JetBrains MPS?我可以用 JetBrains MPS 中生成的 DSL 语言做什么?
【发布时间】:2020-08-15 19:11:40
【问题描述】:

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

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

【问题讨论】:

    标签: dsl mps


    【解决方案1】:

    您可以在 MPS 中做几件事,而无需导出模型:

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

    如果您希望从 MPS 导出数据以用于不同的应用程序,我会采用两种方法 推荐:

    1. 最简单的方法:来自 MPS 扩展的NodeSerializer。我有更多关于如何在blog post 中使用它的详细信息。这可以让您以相当不错的 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,您会遇到一些可以克服但完全没有必要的问题。

    【讨论】:

      【解决方案2】:

      您可以定义一个生成器,将您的语言的句子(文件、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 可能适合您。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-16
        • 1970-01-01
        • 1970-01-01
        • 2017-05-07
        • 2017-04-19
        • 2019-01-15
        • 2015-12-06
        • 2020-08-27
        相关资源
        最近更新 更多