デザインパターンのの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 オプションをつけることで利用します。どちらも動かせました。