我在 JetBrains MPS 中创建了一个简单的 DSL,用于手头的自动化任务。 DSL 允许定义信息对象,而信息对象又将用于代码生成。我能够生成我的模型 - 但我正在努力寻找一种方法将额外的文本生成组件分配给相同的语言概念,即我想要实现的是:
- 信息对象到数据库模型(Python)
- 数据库访问层方法的信息对象(Python)
- protobuf 消息的信息对象
- ...
我觉得我对如何使用它有错误的理解。关于如何为同一语言概念实现不同的输出有什么想法吗?
最佳答案
MPS 只允许您对每个概念有一个 textgen 定义。
MPS 执行您想要执行的操作的方法是在 textgen 之前使用模型到模型转换执行此操作。
为您要创建的三个对象定义附加概念。它们的内容与您已有的根概念基本相同。这些概念将仅用于定义您的文本生成。接下来定义这些概念的文本生成器。
现在您仍然需要创建这些实例,因为您当然不希望用户多次指定这些信息。为此,您需要定义一个生成器。生成器用于 MPS 中模型到模型的转换。
默认情况下,您的语言应该已经有一个生成器。生成器中有一个映射配置main
。在其中,您为您创建的三个新概念中的每一个创建一个根映射。每个规则都将用户指定的概念作为输入概念,并将新概念之一作为模板。您可以通过在编辑器中按 alt + Enter
来创建新模板,然后选择要创建的概念。确保将keep input root
设置为true
而不是default
。
在模板内指定COPY_SRC
将所有内容从输入复制到输出。
在生成过程中,MPS 将从用户在原始模型中创建的概念中创建三个新概念,并在为所有概念执行 textgen 之后。这还允许您为每个根创建不同的文件。
我认为DEMO 1项目展示了您为此需要的一些东西。
关于code-generation - 如何在 Jetbrains MPS 2017.1 中的每个文本生成组件中使用多个概念?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43556853/