我正在XTend中构建一个代码生成器,我已经有了一个输入模型和元模型。 也就是说,我使用ATL为我的XTend代码生成器生成输入模型(作为转换序列的一部分,逐渐降低抽象级别,而不是立即降低;这就是我不使用xtext创建语法的原因) 。

所以要非常清楚,我的代码生成器输入模型是一个XMI格式的文件,而不是xtext项目的语法(甚至没有使用它)! 而且我认为这会给我带来麻烦/困惑。

我使用现有模型创建了一个新的XText项目,右键单击.text文件,运行为,生成人工制品,然后我对mwe2文件执行了相同的操作。

下一步是什么,我做得对吗? 如何启动代码生成器? 所有示例都来自您使用XText创建DSL的POV。 我有一个EMF元模型,以及一个基于XMI的实例。 如何使用XTend进一步处理?

任何提示或指向教程的指针都是有帮助的。

解:

解决方案正如Sven在我接受的答案中所建议的那样,但我还要注意,您需要使用genmodel从元模型生成Java工件。 此链接显示如何: http//www.vogella.com/articles/EclipseEMF/article.html ,请参阅第4节。这可能看起来太符合逻辑,但我认为无论如何都值得注意。

#1楼 票数:19 已采纳

如果您有一个XMI并且只想从中生成代码,则根本不需要Xtext。 刚开始使用Java项目(我使用插件项目,重用依赖关系管理)并开始编码:

import org.eclipse.emf.common.util.URI
import org.eclipse.emf.ecore.EPackage
import org.eclipse.emf.ecore.resource.Resource$Factory$Registry
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl

class MyCodeGenerator {

  def static void main(String[] args) {
    new MyCodeGenerator().generate("mymodel.xmi")
  }

  def generate(String file) {
    doEMFSetup
    val resourceSet = new ResourceSetImpl
    val resource = resourceSet.getResource(URI.createURI(file), true)
    for (content : resource.contents) {
      generateCode(content)
    }
  }

  def dispatch generateCode(MySpecialType it) '''
    public class «name» {
      «FOR member : members»
      «ENDFOR»
    }
  '''

  def dispatch generateCode(MyMember it) '''
    private «type» «name»;
    ...
  '''

  def doEMFSetup() {
//    EPackage$Registry.INSTANCE.put(MyPackage.eINSTANCE.nsURI, MyPackage.eINSTANCE)
    Resource$Factory.Registry.INSTANCE.extensionToFactoryMap.put("xmi", new XMIResourceFactoryImpl);
  }

}

您需要添加到Manifest的依赖项:

Require-Bundle: org.eclipse.xtend.lib,
 com.google.guava,
 org.eclipse.xtext.xbase.lib,
 org.eclipse.emf.common,
 org.eclipse.emf.ecore,
 org.eclipse.emf.ecore.xmi

  ask by Marten Sytema translate from so

未解决问题?本站智能推荐:

1回复

使用EMF加载多个Xmi文件

我已经使用EMF三周了。 我已经使用正在运行的Eclipse应用程序创建了元模型和实例。 现在的问题是,我正在运行的Eclipse实例保存了多个XMI文件,我想对其进行解析,以便创建另一个处理xmi文件中数据的文本文件。 为此,我使用的是EMF的XMIResource API,当我加载没有
1回复

具有ecore元模型的xtend2代码生成

我创建了一个ecore-Metamodel,一个genmodel和一个相应的模型。 现在,我想从中生成代码。 我找到了这篇文章,并想实现它。 我没有收到任何错误等信息,但是如何携带CodeGenerator在“ test.txt”之类的文件中生成所需的输出(该示例取自引用的问题)?
2回复

从XMI文件加载EMF模型实例

我知道有几个有关此主题的QnA。 我尝试了很多解决方案,但总是遇到相同的错误。 我的代码结构如下: 错误: 线程“主”中的异常org.eclipse.emf.ecore.resource.impl.ResourceSetImpl $ 1DiagnosticWrapped
1回复

使用EMF加载和解析XMI文件

我需要通过EMF加载和解析xmi文件(版本:OMG XMI 2.4.1),但现在遇到了问题。 在OMG XMI Spec 2.4.1中 ,有一个XMI模式XMI.xsd和一个XMI-model.xmi 。 因此,例如,在这里,我需要通过EMF加载和解析XMI-model.xmi 。
1回复

从EMF模型加载XMI资源时发生ClassCastException

我想从Eclipse插件环境加载以前持久保存的EMF模型资源。 我尝试如下。 location是相对于平台的路径,例如platform:/resource/Project/default.mymodel 当我尝试使用URI.createURI(...)获取资源时,出现ClassC
2回复

Ecore / EMF可视化

我需要可视化ecore元模型的实例。 我已有一个代表我的元模型的ecore类图表。 创建模型各部分的动态实例后,我得到一个XMI文件。 我想以可视化方式在elipse编辑器中可视化ecore类图表。 希望你能帮我
2回复

EMF-将XML模型转换为XMI

我已经从.xsd文件创建了.ecore和.genmodel元模型。 我正在尝试从一个符合.xsd文件的.xml文件中创建一个模型实例(并因此创建一个.ecore元模型)。 我怎样才能实现这个目标?
1回复

如何在EMF中创建对不同模型XMI的引用

我有一个包含2个类的EMF图。 人和组。 我试图将这2个类保留到2个不同的XMI文件中。 它看起来必须像这样 组.xmi 人.xmi 我知道这是有可能的,但是我无法重新创建它……我只能获得嵌入了Groups中的Persons的XMI。 有任何提示/提示/教程..