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で行われる