DomainModelはsiriusのbasicfamilyを使用する。
model,edit,editorのprojectは下記zip参照
http://eclipse.org/sirius/doc/resources/getstarted/basicfamily.zip
プロジェクト作成
- New > Xtext > 「Xtext Project from Existing Ecore Model」
- Select Epackages で「Add...」 でBasicfamilyPackageを選択、Entry Rule を「Family」 を選択
- 既存のgenmodelを選択し、含まれているEPackageをインポート
- Entry RuleはDSLの包含関係のトップのEClassを指定
- New Xtext Projectは、新規作成と同じ
DSL作成
- generate 宣言を定義
- 新規作成では作成されるが、ecoreから作成だとgenerateが作成されないため、定義が必要
- トップのクラス定義
- 既存の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
- ;
- // ↑↑↑追加↑↑↑
- Generate Xtext Artifactを実行する
mode/generated/xxxx.ecoreが指定したecoreと関連付いている
- 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から解釈されるため、定義不要。
- }
- // ↑↑↑追加↑↑↑
- 既存のecoreをそのままDSLにすることが出来ないのかが調査できていない。
複数パッケージが定義されているecoreの場合
上記以外に「GenerateMyDsl.mwe2」を修正する。