2012-09-17 4 views
10

में लोड ईएमएफ मॉडल उदाहरण मैं एक्सटेन्ड में एक कोड जेनरेटर बना रहा हूं जहां मेरे पास पहले से ही एक इनपुट मॉडल और मेटा मॉडल है। यही है, मैं अपने एक्सटेन्ड कोड जनरेटर के लिए इनपुट मॉडल उत्पन्न करने के लिए एटीएल का उपयोग करता हूं (एक बार क्रमशः एस्ट्रस्ट्रक्शन स्तर को धीरे-धीरे कम करने के लिए एक रूपांतरण अनुक्रम के हिस्से के रूप में; यही कारण है कि मैं वाक्यविन्यास बनाने के लिए xtext का उपयोग नहीं कर रहा हूं) ।एक्सटीएंड

तो बहुत स्पष्ट होने के लिए, कोड जेनरेटर के लिए मेरा इनपुट मॉडल एक्सएमआई प्रारूप में एक फ़ाइल है और xtext प्रोजेक्ट के व्याकरण में नहीं है (यहां तक ​​कि इसका उपयोग भी नहीं)! और मुझे लगता है कि यह मुझे समस्या/भ्रम पैदा कर रहा है।

मैंने मौजूदा मॉडलों का उपयोग करके एक नया एक्सटेक्स्ट प्रोजेक्ट बनाया है, .text फ़ाइल पर राइट क्लिक किया है, जैसे आर्टेफैक्ट उत्पन्न करता है, और फिर मैंने mwe2 फ़ाइल के लिए ऐसा किया।

अगला कदम क्या है, क्या मैं इसे सही कर रहा हूं? मैं अपना कोड जनरेटर कैसे शुरू कर सकता हूं? सभी उदाहरण पीओवी से हैं जो आप डीएसएल बनाने के लिए एक्सटेक्स्ट का उपयोग करते हैं। मेरे पास एक ईएमएफ मेटा मॉडल है, और इसका एक एक्सएमआई आधारित उदाहरण है। XTend का उपयोग करके इसे आगे कैसे संसाधित करें?

किसी ट्यूटोरियल के लिए कोई संकेत या सूचक उपयोगी है।

समाधान:

समाधान के रूप में स्वेन मेरे द्वारा स्वीकृत जवाब में सुझाव दिया था, लेकिन यह भी मैं ध्यान दें कि आप एक genmodel उपयोग करने के लिए अपने मेटा मॉडल से जावा कलाकृतियों उत्पन्न करने के लिए की जरूरत चाहते हैं। यह लिंक दिखाता है कि कैसे: http://www.vogella.com/articles/EclipseEMF/article.html, अनुभाग 4 देखें। यह सभी लॉजिकल दिखाई दे सकता है, लेकिन मुझे लगता है कि वैसे भी ध्यान देने योग्य है।

उत्तर

19

यदि आपके पास एक्सएमआई है और बस इससे कोड उत्पन्न करना चाहते हैं, तो आपको Xtext की आवश्यकता नहीं है। बस एक जावा परियोजना के साथ शुरू (मैं एक प्लग-इन परियोजना का उपयोग करेंगे, निर्भरता प्रबंधन का पुन: उपयोग करने के लिए) और कोडिंग शुरू:

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

} 

निर्भरता आप अपने प्रकट करने के लिए जोड़ने की जरूरत:

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

बहुत बहुत धन्यवाद! एक्सएमआई एक निश्चित मेटा मॉडल का उदाहरण है, क्या आपका कोड इस पर विचार करता है (यानी यह मेटा मॉडल लोड करें?)। या क्या एक्सएमआई प्रारूप वर्णनात्मक है और किसी भी तरह मेटामोडेल को इंगित करता है? –

+0

तो मुझे शायद जेनमोडेल सामान की आवश्यकता है, और इस परियोजना को इस नव निर्मित प्लगइन प्रोजेक्ट की निर्भरता के रूप में जोड़ें? –

+1

बढ़िया, यह काम करता है! हा। क्या आपको लगता है कि इस उदाहरण को XTend साइट पर रखना उपयोगी हो सकता है? मेरे लिए यह XTend के एक सामान्य उद्देश्य की तरह लगता है (यानी इसे XPand के प्रतिस्थापन के रूप में उपयोग करें) –