2012-09-17 17 views
10

XTend'de bir giriş modeli ve meta modeline sahip bir kod üreteci yapıyorum. Yani, XLend kod üreteci için giriş modelini oluşturmak için ATL kullanıyorum (bir kerede yerine soyutlama düzeyini kademeli olarak düşürmek için bir dönüştürme sırasının bir parçası olarak; bu, sözdizimini oluşturmak için xtext kullanmamanın sebebi) .EMT Modeli örneğini XTend

Çok açık olmak gerekirse, kod üreteci için giriş modelim XMI biçimindeki bir dosyadır ve xtext projesinin dilbilgisinde NOT (bunu bile kullanmayın)! Ve bence bu bana sorunlara/karışıklığa neden oluyor.

Varolan modelleri kullanarak yeni bir XText projesi oluşturdum, .text dosyasına sağ tıklayıp, eserler oluşturarak eserler oluşturdum ve mwe2 dosyası için aynısını yaptım.

Sonraki adım nedir, doğru yapıyorum? Kod üretecimi nasıl başlatabilirim? Tüm örnekler, DSL oluşturmak için XText'i kullandığınız POV'den alınmıştır. EMF meta modelim ve bunun XMI tabanlı bir örneğim var. XTend'i kullanarak bunu nasıl işleyebilirim?

Eğiticiye herhangi bir ipucu veya işaretçi yardımcı olabilir.

Çözüm: Sven benim kabul edilen yanıt önerildiği üzere

çözüm oldu, ama aynı zamanda ben size meta modelinden Java eserler oluşturmak için bir genmodel kullanmak gerekir dikkat etmek isteriz. Bu bağlantı nasıl gösterir: http://www.vogella.com/articles/EclipseEMF/article.html, bölüm 4'e bakın. Bu çok mantıklı görünebilir, ama yine de değdiğini düşünüyorum.

cevap

19

Eğer bir XMI'niz varsa ve sadece ondan kod üretmek istiyorsanız, Xtext'e ihtiyacınız yoktur. Sadece bir Java projesi ile başlamak (ı bağımlılık yönetimini yeniden, bir eklenti proje kullanırım) ve kodlama başlamak: Eğer Manifest'e eklemeniz gerekir

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); 
    } 

} 

bağımlılıkları:

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 
+0

Çok teşekkürler! XMI, belirli bir meta modelin örneğidir, kodunuz bunu düşünür (yani, bu meta modeli yükler mi?). Ya da XMI formatı yeterince açıklayıcı ve metamodel bir şekilde işaret ediyor? –

+0

Bu yüzden muhtemelen genmodel nesnelere ihtiyacım var ve bu yeni oluşturulan eklenti projesine bağımlılık olarak bu projeyi ekleyebilir miyim? –

+1

Harika, işe yarıyor! Hah. Bu örneği XTend sitesine koymak faydalı olabilir mi? Benim için XTend'in ortak bir amacı gibi geliyor (yani, XPand'in yerini almak için kullanın) –