如何在 Jetbrains MPS 2017.1 中为每个文本生成组件使用多个概念?

How to use multiple concepts per text gen component in Jetbrains MPS 2017.1?

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

我觉得我对如何使用这个有错误的理解。关于如何为相同的语言概念实现不同的输出有什么想法吗?

MPS 将只允许您为每个概念定义一个文本生成器。

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

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

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

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

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

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

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

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