[デザインパターン] 独自言語を作るなら Interpreterパターンか、パーサージェネレータか?

こんにちは。自分のプログラムのコアでない部分は独自のインタープリタを作って、スクリプトにしたい場合がよくあるのですが、その設計についてまとめてみます。

デザインパターンののInterpreterで1から実装するのも大変なんですよね。
Yaccに代表されるパーサージェネレータの場合は、どれを使うかで結構迷います。大掛かりな感じがしますし。

というわけで、それぞれのメリットです。

Interpreterパターンのメリット

  • 個々の式クラスの小さくて、すっきりとテストできる。
  • 新しい式を既存の式に影響することなく、文法に組み込むことができる。

Interpreterパターンの不向きな場合

  • 大規模な文法の場合はパーサージェネレータなどの利用を検討すべきです。
  • Interpreterパターンでは文法が複雑になると、パフォーマンスに問題が発生したり、使い勝手が著しく落ちたりする可能性があります。

参考:デザインパターンの使い方: Interpreter(2008/12/02 Jeff Langr

Javaのパーサージェネレータでは2つ試してみました。


  • Jacc: just another compiler compiler for Java
  • BYACC/J

Jaccはjarファイルです。BYACCは実行ファイルで /J オプションをつけることで利用します。どちらも動かせました。