S-JIS[2013-08-17/2013-08-28] 変更履歴

XtextでDMDLエディターを作ってみる

XtextAsakusa FrameworkのDMDLエディターを作ってみようかと思う。


前置き

Asakusa FrameworkDMDL(Data Model Definition Language)は、AsakusaFWでデータモデルを定義する為の言語。つまりDSL。
Xtextのターゲットとしてぴったりのはず(笑)

DMDLの記述例:

/* アイテム */
item = {
    code : LONG;
    id   : TEXT;
    name : TEXT;
};

元々、Asakusa FrameworkのDMDLパーサーはJavaCCで作られているので、それを参考にすることも出来そう。
DmdlParser.jj


Xtextプロジェクトの作成

まずは、空のプロジェクトを作る。

  1. メニューバーの「File」→「New」→「Project」で、「New Project」ダイアログを開く。
  2. ツリーから「Xtext」→「Xtext Project」を選択して、Nextボタンを押す。
  3. プロジェクトの情報を入力する。
    項目 設定値 説明
    Project name jp.hishidama.xtext.dmdl_editor プロジェクト名(およびプラグイン名)
    Language Name jp.hishidama.xtext.dmdl_editor.DMDL “DSL”の名前
    Language Extensions dmdl “DSLファイル”の拡張子
    Create SDK feature project   フィーチャープロジェクトを作るかどうか
  4. Finishボタンを押す。

「Language Name」はJavaのクラス名になるので、普通だったら「DMDL」の様な全部大文字にはしないんだけど、DMDLはそれ自体が固有名詞みたいなものなので、こうしている。


xtextの最小限記述

プロジェクトを作成するとDMDL.xtextというファイルが作られているが、この中はGreetingのチュートリアルなので、とりあえず最小限だけの記述に修正する。

チュートリアルでは(「with org.eclipse.xtext.common.Terminals」を使って)Terminalsの定義をミックスインしているが、今回使用しない定義も含まれているので、コピーしてくることにする。
という訳で、初期状態は以下の様にしてみた。

src/jp.hishidama.xtext.dmdl_editor/DMDL.xtext:

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


Xtext目次へ戻る / Eclipseへ戻る / 技術メモへ戻る
メールの送信先:ひしだま