2012-09-17 24 views
10

Tôi đang xây dựng trình tạo mã trong XTend nơi tôi đã có mô hình đầu vào và mô hình meta. Tức là, tôi sử dụng ATL để tạo mô hình đầu vào cho bộ tạo mã XTend (như một phần của chuỗi chuyển đổi để giảm dần mức trừu tượng, thay vì cùng một lúc; đây là lý do tôi không sử dụng xtext để tạo cú pháp) .Tải mẫu EMF Model trong XTend

Vì vậy, rất rõ ràng, mô hình đầu vào của tôi cho trình tạo mã là tệp ở định dạng XMI và KHÔNG ở ngữ pháp của dự án xtext (thậm chí không sử dụng)! Và tôi nghĩ rằng điều này gây ra cho tôi những vấn đề/sự nhầm lẫn.

Tôi đã tạo một dự án XText mới sử dụng các mô hình hiện có, nhấp chuột phải vào tệp .text, chạy dưới dạng, tạo các tạo tác, và sau đó tôi đã làm tương tự cho tệp mwe2.

Bước tiếp theo, tôi có làm đúng không? Làm thế nào tôi có thể bắt đầu trình tạo mã của tôi? Tất cả các ví dụ là từ POV mà bạn sử dụng XText để tạo một DSL. Tôi có một mô hình meta EMF, và một cá thể dựa trên XMI của nó. Làm thế nào để xử lý hơn nữa bằng cách sử dụng XTend?

Bất kỳ gợi ý hoặc con trỏ nào cho hướng dẫn đều hữu ích.

Giải pháp:

Giải pháp là như Sven gợi ý trong câu trả lời chấp nhận của tôi, nhưng tôi cũng muốn lưu ý rằng bạn cần phải sử dụng một genmodel để tạo ra vật Java từ mô hình meta của bạn. Liên kết này cho thấy làm thế nào: http://www.vogella.com/articles/EclipseEMF/article.html, xem phần 4. Điều này có thể xuất hiện tất cả các quá logic, nhưng tôi nghĩ rằng nó đáng chú ý anyway.

Trả lời

19

Nếu bạn có XMI và chỉ muốn tạo mã từ nó, bạn không cần Xtext chút nào. Chỉ cần bắt đầu với một dự án Java (Tôi muốn sử dụng một dự án plug-in, sử dụng lại công tác quản lý phụ thuộc) và bắt đầu mã hóa:

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

} 

Các phụ thuộc bạn cần phải thêm vào Manifest của bạn:

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

Cảm ơn rất nhiều! XMI là ví dụ của một mô hình meta nhất định, mã của bạn có xem xét điều này (ví dụ: tải mô hình meta này không?). Hoặc là định dạng XMI đủ mô tả và chỉ vào metamodel bằng cách nào đó? –

+0

Vì vậy, tôi có lẽ cần các công cụ genmodel đúng, và thêm rằng dự án như là một phụ thuộc vào dự án này mới được tạo ra plugin? –

+1

Tuyệt vời, nó hoạt động! Hah. Bạn có nghĩ rằng có thể hữu ích khi đặt ví dụ này trên trang web XTend? Với tôi nó có vẻ giống như một mục đích chung của XTend (tức là sử dụng nó như là thay thế cho XPand) –

Các vấn đề liên quan