2

我在 JetBrains MPS 中为手头的自动化任务创建了一个简单的 DSL。DSL 允许定义信息对象,这些信息对象又将用于代码生成。我能够生成我的模型 - 但我正在努力寻找一种方法将额外的文本生成组件分配给相同的语言概念,即我想要实现的是:

  • 数据库模型的信息对象(python)
  • 数据库访问层方法的信息对象(python)
  • protobuf 消息的信息对象
  • ...

我觉得我对如何使用它有错误的理解。关于如何为同一语言概念实现不同输出的任何想法?

4

2 回答 2

3

MPS 将只允许您对每个概念有一个 textgen 定义。

做你想做的事情的 MPS 方法是在 textgen 之前使用模型到模型转换来执行此操作。

为您要创建的三个对象定义附加概念。它们的内容与您已经拥有的根概念中的内容基本相同。这些概念将仅用于定义您的 textgen。所以接下来为这些概念定义 textgen。

现在您仍然需要创建这些实例,因为您当然不希望用户多次指定这些信息。为此,您需要定义一个生成器。生成器用于 MPS 中的模型到模型转换。

默认情况下,您的语言应该已经有一个生成器。在生成器中是一个映射配置main。在那里,您为您创建的三个新概念中的每一个创建一个根映射。这些规则中的每一个都将用户指定的概念作为输入概念,并将新概念之一作为模板。alt + enter您可以通过在编辑器中按下并选择要创建的概念来创建新模板。确保您设置keep input roottrue而不是default.

在模板中,您指定 aCOPY_SRC将所有内容从输入复制到输出。

然后在生成过程中发生的事情是,MPS 将从用户在原始模型中创建的概念中创建三个新概念,并在为所有这些概念执行 textgen 之后。这也允许您为每个根创建不同的文件。

我认为DEMO 1项目展示了你需要的一些东西。

于 2017-04-23T09:19:17.307 回答
0

您可能需要考虑使用 plaintextgen 插件:https ://plugins.jetbrains.com/plugin/8444-com-dslfoundry-plaintextgen

于 2017-04-24T13:00:22.610 回答