読者です 読者をやめる 読者になる 読者になる

プログラミングの魔物

エラー、バグ、仕様変更と戦うブログ

23.Interpreter 文法規則をクラスで表現する

デザインパターンの目的の一つはクラスの再利用性を高めること。再利用性とは、一度作成したクラスをあまり修正せずに(できれば全く修正せずに)何度も使えるようにすること。
Interpreterパターンでは解決しようとしている問題を「ミニ言語」で表現する。ミニ言語で書かれた「ミニ・プログラム」で問題を解決する。問題が変化したらミニプログラムを書き換える。

BNFを使って言語を再帰的に定義。

f:id:p-monster:20121218200024p:plain

AbstractExpression・・・構文木のノードの共通API
TerminalExpression・・・終端ノード
NonterminalExpression・・・非終端ノード。集合やリピートなど
Context・・・インタプリタ構文解析を行うための情報を提供
Client・・・構文木を組み立てるためにTerminalExpressionやNonterminalExpressionを呼び出す

ミニ言語の例・・・正規表現、検索用の表現、バッチ処理言語(ラジコン)

関連しているパターン

Composite・・・NonterminalExpressionは再帰的な構造を持つことが多いのでCompositeパターンを使うことが多い
Flyweight・・・TerminalExpressionはFlyweightパターンで共有されることもある
Visitor・・・構文木を作った後、各ノードを巡回しながら処理を行う時はVisitorが使われることもある

参考:

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門