「Xtextってものがあるよ」と言われたので試してみたら、超便利で感激した!
Xtextは、DSLのエディターを作れるフレームワーク(Eclipseプラグイン)。
BNFみたいな記法でDSLのルールを定義するだけでエディターが作られるので、非常に便利。
自分独自のDSLを作りたいと思った場合、内部DSLと外部DSLという2つの方式がある。
内部DSLは、他の言語(ホスト言語と呼ぶ)上でDSLを記述できるようにする。例えばScalaやRubyは内部DSLを作るのに向いているらしい。
外部DSLの場合は、DSLを読み込んで解釈するパーサーを作らなければならない。パーサーを生成する言語も色々あるが、Xtextはパーサーだけでなくエディターまで生成されるところが優れている。
内部DSLを使うのは、パース(解析・解釈)の部分を作るのが大変であるとか、ホスト言語のエディター(やコンパイラー)を使えるとかの理由があるのだが、Xtextがあれば外部DSLも充分作りやすい。
Xtextで生成されるエディターでは、(DSLのルール定義をするだけで)キーワードに色が付いたり、入力補完できるようになったり、文法エラーが出たりする。
ハイパーリンク(クロスリファレンス)も定義できて、(定義しただけで)リンク箇所を検索したり連動して改名したりできるのにはとても驚いた。
→Xtextの基本機能で出来る内容
生成されるクラスや親クラスの各メソッドがprotectedになっていたりDI(依存性の注入)で別クラスを使用できるようになっていたり、拡張性がよく考えられていて好感が持てる。
やっぱフレームワークはこうでないと(笑)
Xtextがあまりにも優れているもんだから、素のEclipseプラグインとして作っていたDMDLエディターをXtextで作り直した。(Xtext版DMDL Editor、略してDMDL EditorX)
DMDLエディタープラグインもだいぶ作り込んでいたので捨てるのは勿体無いんだけど、機能追加が面倒だなぁと思っていた部分が、Xtextだと何もせず実現されていたりするので。
Eclipseプラグインの勉強をしながら1ヶ月くらいで作ったものが、Xtextの勉強を始めて半月くらいで出来た。
Xtextと関係ない機能も移植したけど、構文木関連のクラス名をちょっと変える程度で移植できたし。
Xtextの構文木(EObjectやINode)を用いてDSLを置換する面の機能はちょっと弱いような気がするけど、まだ使い方が分かっていない部分があるからだろう。
という訳で、DSLを作りたいと思う人がどれくらいいるのか知らないけど、Xtextは便利ですよ(笑)
※コメント投稿者のブログIDはブログ作成者のみに通知されます