0

假设我在 MPS 中开发了一组行为,允许我WordDocument使用 POI 将描述 Word 处理器文档的概念(和子项)的实例转换为 MS Word 文档,并且我已经能够实现一个动作在一个 MPS 插件中,它允许我通过右键单击我的根节点来生成我想要的 MS Word 文档。

我想将此作为生成过程中的一个阶段添加,以便在模型到模型阶段之后,MPS 的生成过程执行模型到 MS 字的生成,而不是模型到文本。

MPS 是否可以通过这种方式进行定制,要使用的概念集是什么?

4

1 回答 1

1

MakeSession当您在 MPS 中对模型运行 make 或重新构建时,MPS 将在此会话中启动一个所谓的 MPS 执行多个步骤。例如,make 会话中的一个步骤是“generate”,它运行模型到模型的转换,第二个是“textgen”,然后通过执行语言的 textgen 定义将生成步骤的结果模型写入磁盘.

这些单独的步骤称为“方面”。您可以将自己的方面贡献到整个制作过程中。为此,您需要用您的语言创建一个插件方面,然后在其中创建一个方面。在方面,您可以声明它的依赖关系和优先级。在您的情况下,您希望在 textgen 之前但在生成之后运行,以便您可以访问生成的结果。

构面可以以声明的方式统计它们的输入数据。在您的情况下,您需要GResource表示生成器方面的输出。然后您可以访问其上的模型并在其上运行您的 POI 代码。

一个最小的示例如下所示:

facet RunPoi extends <none> {                                                                                                                                                                     
    Required: Generate, TextGen                                                                                                                                                                     

    <no optional facets>                                                                                                                                                                            
    Targets:                                                                                                                                                                                        
        target genWord overrides <none> weight default { 
            resources policy: transform GResource -> <no output>                                                                                    

        Dependencies:                                                                                                                             
            after generate                                                                                                                          
            before textGen                                                                                                                          
            before textGenToMemory                                                                                                                  

        <no properties>                                                                                                                           
        <no queries>                                                                                                                              
        <no config>                                                                                                                               
        (progressMonitor, input)->void { 
            foreach resource in input { 
                SModel mdl = resource.model; 
                // run poi code with mdl 
            } 
        }   
    }
}  
于 2018-12-20T08:17:19.383 回答