10

入力モデルとメタ モデルが既にある XTend でコード ジェネレーターを構築しています。つまり、ATL を使用して XTend コード ジェネレーターの入力モデルを生成します (変換シーケンスの一部として、一度にではなく、徐々に抽象化レベルを下げます。これが、xtext を使用して構文を作成しない理由です)。 .

明確にするために、コード ジェネレーターの入力モデルは XMI 形式のファイルであり、xtext プロジェクトの文法ではありません (それを使用していません)。そして、これが私に問題/混乱を引き起こしていると思います。

既存のモデルを使用して新しい XText プロジェクトを作成し、.text ファイルを右クリックして as として実行し、アーティファクトを生成してから、mwe2 ファイルに対して同じことを行いました。

次のステップは何ですか?コード ジェネレーターを起動するにはどうすればよいですか? すべての例は、XText を使用して DSL を作成する POV からのものです。EMF メタ モデルと、その XMI ベースのインスタンスがあります。XTend を使用してそれをさらに処理するにはどうすればよいですか?

チュートリアルへのヒントやポインタは役に立ちます。

解決:

解決策は、私の受け入れられた回答で Sven が提案したとおりでしたが、genmodel を使用してメタ モデルから Java アーティファクトを生成する必要があることにも注意してください。このリンクはその方法を示しています: http://www.vogella.com/articles/EclipseEMF/article.html、セクション 4 を参照してください。

4

1 に答える 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
于 2012-09-18T06:54:34.180 に答える