Xtext

Xtext
http://www.eclipse.org/Xtext/

Eclipse用のDSL(Domain Specific Language;ドメイン固有言語)作成環境。

Xtextを使うと...

  • 自分で定義したDSL用の高機能エディタが生成できる
    • 文法ハイライト
    • 文法エラーの検出
    • コード補完
    • グラフィカルモデリング
  • 自分で定義したDSLをAST(Abstract Syntax Tree;抽象構文木)に変換してくれるので、そこから任意のコードが生成できる
    • コード生成用のテンプレート エンジン付き

やってみる

Xtext User Guide
http://www.eclipse.org/Xtext/documentation/1_0_1/xtext.html#getting-started-xpand

「2. Getting Started」をやってみる。

  1. 準備
    1. Eclipse Heliosをインストールしておく
    2. Eclipse Heliosのメニューから「Help」-「Eclipse Marketplace」を選択し、「Xtext」を検索してインストールする
  2. DSLを作る
    1. Xtextプロジェクトを生成する
      • プロジェクトウィザードから作成
      • プロジェクトが3つできる(文法定義用、UI用、コード生成用)
    2. DSLを定義する(文法定義用プロジェクトで作業する)
      • .xtextファイルに記述する
      • 書式はBNFを拡張したような感じで、解析ルールだけではなくAST自体も表現する
      • ?は0 or 1、*は0 or 1以上、+は1以上
      • []はクロスリファレンス(相互参照)用
      • x = yと書くと、yで定義したルールオブジェクトがxに入る
      • x = yはsetX()、x += yはgetList().add()、x ?= yはsetX(true)
    3. DSL処理機を生成する
      • .mwe2 を選択して「Run As」 - 「MWE2 Workflow」
    4. 実行する
      • プロジェクトを選択して「Run As」 - 「Eclipse Application」
      • 新しくプロジェクトを作ってプロジェクトウィザードで指定した拡張子のファイルを作成すると、様々な機能が有効になったエディタでDSLコードが書ける
  3. コードを生成する(コード生成用プロジェクトで作業する)
    1. 変換対象のファイルを用意する
      • modelパッケージ内のファイル
    2. 生成プロセスを.mwe2ファイルに記述する
    3. テンプレート(Xpand)を.xptファイルを記述する
      • 変な記号(«»)はエディタの補完で入力する
    4. 拡張コード(Xtend)を.extファイルに記述する
    5. コードを生成する
      • .mwe2ファイルを選択して「Run As」 - 「MWE2 Workflow」
      • src-genソースフォルダーにjavaファイルが生成される
      • ドキュメント通りだとテンプレートにエラーがあって生成されたJavaコードがエラーになるので修正する('{' がひとつ多い)

どこで使う?

汎用的なものが作れれば良いが最初は難しいし、せっかく自分専用言語が簡単に作れるので身近なところから考えてみればいいと思う。DSLの難点は文法を新しく覚えなければならないところだが、Xtextならエラーチェックもあるエディタが簡単に作れるので、そういう意味でも導入しやすいはず。また、ANTLRならすでにある様々な言語の文法(grammar)ファイルがダウンロードできるので、既存言語の拡張とかも面白いかも。(長沼)