2016年3月20日日曜日

ecoreからdslを作成する

 xtextの新規作成ウィザードで 「Xtext project from existing Ecore models」 を使った場合の手順及び注意点を残す


 DomainModelはsiriusのbasicfamilyを使用する。




model,edit,editorのprojectは下記zip参照

http://eclipse.org/sirius/doc/resources/getstarted/basicfamily.zip


 プロジェクト作成

  1. New > Xtext > 「Xtext Project from Existing Ecore Model」
  2. Select Epackages で「Add...」 でBasicfamilyPackageを選択、Entry Rule を「Family」 を選択
    1. 既存のgenmodelを選択し、含まれているEPackageをインポート
    2. Entry RuleはDSLの包含関係のトップのEClassを指定
  3. New Xtext Projectは、新規作成と同じ

 DSL作成

  1. generate 宣言を定義
    1. 新規作成では作成されるが、ecoreから作成だとgenerateが作成されないため、定義が必要
  2. トップのクラス定義
    1. 既存のecoreをインポートしただけだと、buildした時にxtext無いのpackageが空のため、例外packageにからのため、例外がでる。  
           Caused by: java.lang.IllegalStateException: Generated package 'mydsl' may not be empty.
           at org.eclipse.xtext.xtext.generator.XtextGeneratorLanguage$2.add(XtextGeneratorLanguage.java:346)
      
      

      dslの設定例
      // automatically generated by Xtext
      grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals
      
      generate mydsl "http://www.eclipse.org/sirius/sample/basicfamily2" 
      
      import "http://www.eclipse.org/emf/2002/Ecore" as ecore
      import "http://www.eclipse.org/sirius/sample/basicfamily"
      
      // ↓↓↓追加↓↓↓
      Root:                            
       family=Family            
      ;                                
      // ↑↑↑追加↑↑↑
  3. Generate Xtext Artifactを実行する
    mode/generated/xxxx.ecoreが指定したecoreと関連付いている 



    複数パッケージが定義されているecoreの場合


    上記以外に「GenerateMyDsl.mwe2」を修正する。

    module org.xtext.example.mydsl.GenerateMyDsl
    
    import org.eclipse.xtext.xtext.generator.*
    import org.eclipse.xtext.xtext.generator.model.project.*
    
    var rootPath = ".."
    
    Workflow {
    // ↓↓↓追加↓↓↓
     bean = org.eclipse.emf.mwe.utils.StandaloneSetup{                                                   
      registerGeneratedEPackage="org.eclipse.sirius.sample.basicfamily.BasicfamilyPackage"        
                    // 複数のEPackageを使用する場合には、StandaloneSetupを追加して、registerGeneratedEPackageに使用するEPackageのクラスを指定する。
                    // 単一の場合はgenmodelから解釈されるため、定義不要。
     }
    // ↑↑↑追加↑↑↑
    


    疑問点

    1.  既存のecoreをそのままDSLにすることが出来ないのかが調査できていない。