2011年8月19日金曜日

Xtextグラマーのポイント(1)

Xtext Documentationにある 15 Minutes Tutorial の最小のサンプルから、Xtextグラマーのポイントをおさえてみます。

grammar org.example.domainmodel.Domainmodel with
                                      org.eclipse.xtext.common.Terminals
generate domainmodel "http://www.example.org/domainmodel/Domainmodel"

Model:
    greetings+=Greeting*;

Greeting:
    'Hello' name=ID '!';

grammer宣言

grammar org.example.domainmodel.Domainmodel with                                      org.eclipse.xtext.common.Terminals
このDSLグラマーの名前を宣言しています。
グラマー名は、モデルのJavaパッケージ名と、関連クラス名に反映されます。
with句でmix-inする他のグラマー名を指定すると、他の構文を取り込めます。
この例では、標準の終端定義を取り込んでいます。


generate宣言

generate domainmodel "http://www.example.org/domainmodel/Domainmodel"
EMFのEcoreモデルとJavaモデルのクラスの生成を指示します。
名前部分は、EPackage名とDSLファイル拡張子に反映されます。
URI部分は、EcoreモデルのnsURIに反映されます。

ルール定義
Model:Greeting:
の部分はルールを新たに定義しています。
ルール名は、グラマーの中で子要素のルールとして参照されます。
また、ルール名はそのままモデルクラスとして生成されます。

子要素と割当
greetings+=Greeting*;
 'Hello' name=ID '!';
の部分は、子要素への適用ルール宣言と、フィールドへの割当を定義しています。
左辺は、ルールで表されるモデルのフィールド名になります。

"greetings"の"+="オペレータは、複数要素を許容するためリストになります。
右辺は、適用されるルールです。
"Greeting*" は正規表現同様、0回以上の複数回の出現を許容しています。
右辺が終端(ID)の場合は、属性メンバーとしてモデル化されます。
右辺が非終端ルール(Greeting)の場合は、参照メンバーとしてモデル化されます。
なお、クロスリファレンスじゃない子要素は、包含参照としてモデル化されます。

キーワード
'Hello' name=ID '!';
の、クォートで囲まれた箇所は、キーワードになります。
キーワードはDSL中にそのままの形、順序で出現すること求められます。
複数ルールが許容される局面で、選択ルールを判別するためにも使用されます。
キーワードはエディタでコンテンツアシストもされます。


どうでしょうか。
グラマーと併せてモデルも簡単に定義できることがお分かり頂けたでしょうか。

0 件のコメント:

コメントを投稿