uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

ビルダー×ビルダー DSL作成支援・DSLパーサジェネレータ?

StateMachine: a Builder-Builder for Groovy, part 1という記事がおもしろい。


まず、前提知識として、システムが処理対象とする業務分野に応じてその業務領域をうまく記述できるような専用言語のことをDSL(業務固有言語)と呼びます。例えば「Swing GUIを記述するための言語(というより記法かな)」とか、株価を処理するシステム開発のための「株価変動記述言語」とかがDSLになります。んで、GroovyはDSLを構築するのに向いている言語です。Groovyは強力で柔軟なんで、Groovy自身で言語の拡張ができ、DSLを作れるというわけです。

GroovyでDSLを簡単に作るための仕組みの一つとして、「ビルダー」というものがあります。ビルダーって言うのは、メソッドコールとかクロージャを駆使して、任意の木構造を書きやすくするものです。言語記述ってのは要は具象構文木なわけで、この「木構造を作り出す」ビルダーの機能がDSL構文定義にはうってつけというわけです。

ここまでが前置き。で、前述の記事は、「任意のDSL構文ルールを与えると、それに適合するDSLをパースしてくれるビルダー」を作ったよ、という話。ミソは、与えるDSL構文ルールも、ビルダーで定義されたDSLだということ。その「構文ルール記述用ビルダー」は、他の特定DSLビルダーを作るためのものだから、ビルダービルダーになる。

BNFみたいなのを与えるとそれを解釈実行するパーサができるわけです。この場合、パーサ「ジェネレータ」ではなく、インタプリタ的に動作するわけですから、なんだ、「パーサインタプリタ」「インタプリタパーサ」とでも言うのかな言わないかな。



HUNTER×HUNTER 24 (ジャンプコミックス)

HUNTER×HUNTER 24 (ジャンプコミックス)