2011年8月19日金曜日

Xtextグラマーを学ぶ

XtextによるDSL開発はグラマー定義から始めます。
グラマー定義の基礎を一通り試すには、以下のチュートリアルがお勧めです。


Xtext 15 Minutes Tutorial

DSL例

datatype String

entity Blog {
    title: String
    many posts: Post
}

entity HasAuthor {
    author: String
}

entity Post extends HasAuthor {
    title: String
    content: String
    many comments: Comment
}

entity Comment extends HasAuthor {
    content: String
}
グラマー例

grammar org.example.domainmodel.DomainModel with
                                      org.eclipse.xtext.common.Terminals

generate domainmodel "http://www.example.org/domainmodel/Domainmodel"

Domainmodel :
  elements += Type*
;

Type:
  DataType | Entity
;

DataType:
  'datatype' name = ID
;

Entity:
  'entity' name = ID ('extends' superType = [Entity])? '{'
     features += Feature*
  '}'
;

Feature:
  many?='many'? name = ID ':' type = [Type]
;

このチュートリアルでは、Eclipse上でのXtextプロジェクトの作り方を含めて、サンプルをもとにしたグラマー定義を体験できます。実際にDSLでよく現れる問題に、Xtextの構文定義をどのように行うべきかを学ぶことができます。
  • 構文ルールの開始や有無を識別するキーワードの定義
  • 構文ルール内の要素をモデルのフィールドへ割当
  • 構文ルールが複数の子要素を持つ場合の定義と値の獲得
  • 構文ルールが複数の構文ルールの選択である場合の定義
  • ユーザ定義識別子へのクロスリファレンスの定義方法
このチュートリアルでは、グラマー定義の本質的な部分を学ぶことが出来ますが、例えば以下のようなことは含まれていません。
  • 終端(Terminal)と値型の定義
  • 列挙による終端定義
  • ルールとEMFモデルとの対応のカスタマイズ
こうした、より深いテーマについては、以下のリファレンスで学ぶことが出来ます。リファレンスとは言っても、こちらもまた分かりやすいサンプルをもとにしているので、とても分かりやすいです。

The Xtext Grammar Language

このリファレンスでは、グラマーの細かい部分まで学ぶことができるので、15分チュートリアルが終わったら、さっと目を通してみると良いでしょう。

0 件のコメント:

コメントを投稿