XtextでAsakusa FrameworkのDMDLエディターを作ってみようかと思う。
|
Asakusa FrameworkのDMDL(Data Model
Definition Language)は、AsakusaFWでデータモデルを定義する為の言語。つまりDSL。
Xtextのターゲットとしてぴったりのはず(笑)
/* アイテム */ item = { code : LONG; id : TEXT; name : TEXT; };
元々、Asakusa FrameworkのDMDLパーサーはJavaCCで作られているので、それを参考にすることも出来そう。
→DmdlParser.jj
まずは、空のプロジェクトを作る。
項目 | 設定値 | 説明 |
---|---|---|
Project name | jp.hishidama.xtext.dmdl_editor |
プロジェクト名(およびプラグイン名) |
Language Name | jp.hishidama.xtext.dmdl_editor.DMDL |
“DSL”の名前 |
Language Extensions | dmdl |
“DSLファイル”の拡張子 |
Create SDK feature project | フィーチャープロジェクトを作るかどうか |
「Language Name」はJavaのクラス名になるので、普通だったら「DMDL」の様な全部大文字にはしないんだけど、DMDLはそれ自体が固有名詞みたいなものなので、こうしている。
プロジェクトを作成するとDMDL.xtextというファイルが作られているが、この中はGreetingのチュートリアルなので、とりあえず最小限だけの記述に修正する。
チュートリアルでは(「with org.eclipse.xtext.common.Terminals
」を使って)Terminalsの定義をミックスインしているが、今回使用しない定義も含まれているので、コピーしてくることにする。
という訳で、初期状態は以下の様にしてみた。
grammar jp.hishidama.xtext.dmdl_editor.DMDL hidden(WS, ML_COMMENT, SL_COMMENT) import "http://www.eclipse.org/emf/2002/Ecore" as ecore generate dmdl "http://www.hishidama.jp/xtext/dmdl_editor/dmdl" Models: (list+=ModelDefinition)*; ModelDefinition: name=Name '=' '{' '}' ';'; Name: NAME_TOKEN; terminal NAME_TOKEN: ('a'..'z') ('a'..'z' | '0'..'9')* ('_' ('a'..'z' | '0'..'9')+)*; terminal ML_COMMENT: '/*'->'*/'; terminal SL_COMMENT: ('//' | '--') !('\n' | '\r')* ('\r'? '\n')?; terminal WS: (' ' | '\t' | '\r' | '\n')+;
一番上の行は、チュートリアルだと「with org.eclipse.xtext.common.Terminals
」だが、Terminals.xtextに書かれていたhiddenに置き換えている。
次の行のimportもTerminals.xtextに書かれていたimportをそのままコピーしてきた。(これが無いとterminalの定義が出来ないっぽい)
generateの行のURIは、ecore内でDSLを識別する為に使われるものらしい。
(したがって、インターネット上のその場所に何かのファイルが必要というわけではない)
Models・ModelDefinition・Nameは、DMDLのとりあえずの定義。
NAME_TOKENは、Terminals.xtextにあったIDという定義のDMDL版。
ML_COMMENT(マルチライン(複数行)コメント)・SL_COMMENT(シングルライン(単一行)コメント)・WS(ホワイトスペース)はTerminals.xtextから持ってきた。
(ただしSL_COMMENTに関しては、「--
」で始まる場合もコメントになるよう拡張している)
これらの定義の名前を(ファイルの先頭の)hiddenに書いておくと空白扱いされるらしい。
WL_COMMENT・SL_COMMENTの定義名は変えない方が良さそう。というのは、他の名前に変えたら、生成されたエディター上でコメントに色が付かなくなった為。
色付けのデフォルト実装で、WL_COMMENT・SL_COMMENTの定義名が使われている。[/2013-08-28]
→コメントの判定はIHiddenTokenHelperで行われる
同様に、WSの定義名も変えない方が良い。
他の名前に変えたら、生成されたエディター上でソース整形(Ctrl+Shift+F)をしたときに空白が増えていく(苦笑)という現象になった為。
フォーマッターのデフォルト実装で、WSの定義名が使われている。[/2013-08-28]
→空白文字の判定はIHiddenTokenHelperで行われる