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

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

问题描述:

我在JetBrains MPS中为自动化任务创建了一个简单的DSL。 DSL允许定义信息对象,这些信息对象又将用于代码生成。我能够产生我的模型 - 但我在努力寻找一种方法来一个额外的文本根组件分配到同一种语言的概念,即什么,我想实现的是:如何在Jetbrains MPS 2017.1中为每个文本创建组件使用多个概念?

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

我觉得我得到了关于如何使用这个错误的认识。关于如何为相同语言概念实现不同输出的想法?

+0

每个信息的对象应该有它自己的文件或者你想创建他们都在一个单一的文件? – Kolja

+1

理想情况下,每层都会有不同的输出文件,即一个输出文件包含所有模型定义,一个输出文件包含protobuf模式定义等。我发现了一个有点解决方法[here](https:// mps-support .jetbrains。com/hc/en-us/community/posts/206613545 -TextGen-multiple-files-output-per-concept-instance-#community_comment_203694104) - 事情是,这仍然不允许我为我的非 - 根概念。 –

+0

另一个想法出现在我的脑海里:从我的实际语言中删除所有文本gen组件,并定义一种扩展我的基本语言的语言,以生成每个图层/文件。这些额外的语言将只包含文本gen转换,但不包含实际的语言概念。你怎么看? –

MPS将只允许您为每个概念使用单个文本定义。

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

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

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

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

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

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

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

+0

感谢您的详细解答。我仍然在挣扎 - 我不确定当按'alt + enter'设置映射规则的根模板时我应该选择什么(参见[截图](http://imgur.com/n2GPbOV) –

+1

Don 't介意我的问题,忘记将语言添加到“使用的语言”,现在就像是一种魅力! –

+0

@JanWendland您可以详细说明您做了什么吗?我可以按照此处所述的所有步骤进行操作,但是在预览生成的文本时,错误。 – davidmpaz