我正面临一个问题而且我有点沮丧:
我正在尝试将约束OCL转换为C#程序。为此,我在CompleteOCL文档中定义了我的ocl约束,并将其保存为抽象语法:POC.ocl.oclas。然后我将Acceleo与Pivot元模型('http://www.eclipse.org/ocl/2015/Pivot')一起使用。
但是,常见的OCL操作(例如“大小”)在另一个模型中定义:库。因此,当我尝试恢复在我的OCL模型上使用的操作时,没有任何反应,我只能恢复我在ocl文档中定义的操作。
当我打开POC.ocl.oclas时,我有这两个模型: POC.ocl model + Library model
我定义了这些代:
[comment encoding = UTF-8 /]
[module generate('http://www.eclipse.org/ocl/2015/Pivot','http://www.eclipse.org/ocl/2015/Library')]
[template public generateElement(aModel : Model)]
[comment @main/]
[file (aModel.name + 'xx', false, 'UTF-8')]
yo
[/file]
[/template]
它只生成一个文件:“POC.oclxx”,而不是“Library.oclxx”
这引出了我们这个问题: 在Acceleo中是否可以引用另一个模型(而不是主模型)? 如果是的话,怎么做?
ANNEXE:
我写的代码:
[comment getCode() opération/]
[template public getCode(operationCallExp : pivot::OperationCallExp) post (trim())]
[operationCallExp.ownedSource.getCode()/]
[operationCallExp.referredOperation.name/][operationCallExp.ownedArguments -> getArguments()/]
[/template]
理论上,[operationCallExp.referredOperation.name/]
给了我操作的名称。实际上,它没有给我任何东西,除非我定义了操作(因此当操作不是来自OCL库时)
提前谢谢!
压缩的项目:Archive_OCL_Acceleo
POC 文件夹包含POC元模型(POC.ecore),此元模型上的OCL约束(POC.ocl)和Pivot模型关联(POC.ocl.oclas)。 Acceleo生成的文件位于文件夹
中POC_Acceleo forlder包含Acceleo转换(generate.mtl)
答案 0 :(得分:0)
从* .oclas文件扩展名,我认为您正在使用/我的基于Pivot的Eclipse OCL抽象语法。
我从OCL首次尝试使用Java来生成Java代码,但是由于各种原因我放弃了这一点,尤其是从OCL AS到Java代码的步骤太大而无法在单个M2T步骤中执行。虽然Java(并且毫无疑问是C#)看起来与OCL类似,使得简单的文本模板驱动的翻译具有吸引力,但这种方法注定只支持一个适度的语言子集。真正的代码生成需要真正的分析,例如Common Subexpression Elimination,如果你重写了源代码,它们会在保留的源和重写源之间引入冲突。
当前Eclipse OCL to Java Generator(我的第三次尝试)使用了一个重写发生的中间CG模型。它可以重新定位到C(或C#或......)。我有很多计划在我的下一次(第四次)尝试中使用更进一步的Java(或C或C#或......)中间模型来更高级别的自动生成,以将“琐碎”的文本语言序列化与非平凡的语言分开概念合成。
如果您对C#生成的严谨而非简化的示例工具感兴趣,我强烈建议您查看Eclipse OCL CG。如果你想协同工作以使其变得更好并且很乐意为你提供EPL下的贡献,那么也许我们可以安排一些事情。
答案 1 :(得分:0)
您使用的是最新代码吗?我记得最近修复了一些关于缺少“化妆品”AS模型内容的错误。