如何在Jetbrains MPS 2017.1中使用每个文本gen组件的多个概念?

时间:2017-04-22 08:06:27

标签: code-generation dsl mps

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

  • db model(python)的信息对象
  • 信息对象到db访问层方法(python)
  • 信息对象到protobuf消息
  • ...

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

2 个答案:

答案 0 :(得分:3)

MPS只允许您按照每个概念使用单个textgen定义。

MPS执行您想要做的事情的方法是在textgen之前使用模型进行模型转换。

为您要创建的三个对象定义其他概念。它们的内容与您已有的根概念基本相同。这些概念仅用于定义您的textgen。接下来为这些概念定义textgen。

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

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

在模板中指定COPY_SRC以将输入中的所有内容复制到输出。

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

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

答案 1 :(得分:0)