Interpreterパターン
Interpreterパターンは、ある構文解析の規則をクラスで表現するデザインパターン。
1つのクラスで1つの解析規則を作成し、解析結果を次のクラスの解析に渡す。複数クラスを使って文字列の構文解析を行い、その結果を返す、というふうに実装する。
自分なりにInterpreterパターンをクラス図にまとめてみました。
Interpreterパターンのクラス図
Interpreterパターンの解説
ある文字列を構文解析するとき、1文字ずつ解析していき、ある文字に対してはどのような処理を行うか、を定義していくのがExpression1,2のinterpretメソッドになる。そして、Expression1,2のインターフェースをExpressionインターフェースで定義しておく。各interpretメソッドでは、構文解析途中の内容をContextクラスにまとめ、次のinterpretメソッドの引数に渡すことで、解析を進めていく。
Parserクラスでは与えられた解析対象の文字列を分解し、解析が必要な順番に応じてExpressionを用意し、属性expressionsに格納しておく。parseメソッドではこのexpressionsを順番に用いて解析を行い、全て解析が終わったら結果を返す。
Interpreterパターンをどういう場合に使うか
自分自身は実装した経験はないが、SQLや正規表現などがInterpreterパターンだそうである。
開発するアプリケーションになにかしらの構文ルールを設けた入力を行い、その内容を構文解析して処理を実行するような場合に、Interpreterパターンを用いることができる。
PlantUMLでInterpreterパターンのクラス図を記述する
Interpreterパターンのクラス図をPlantUMLで書いたときのソースです。
@startuml Interpreter
class Parser{
+ expressions : Expression[]
+ parse() : String //expressionsを用いて解析し、結果を返す(Stringは一例)
}
class Context{
}
interface Expression{
+ interpret(Context) : void
}
class Expression1 implements Expression{
+ interpret(Context) : void
}
class Expression2 implements Expression{
+ interpret(Context) : void
}
Parser o--> Expression
Expression1 --> Context
Expression2 --> Context
@enduml
参考サイトURL
Interpreter パターン – Wikipedia
PHPによるデザインパターン入門 – Interpreter〜言語の文法表現を通訳する – Do You PHP はてブロ
Interpreter パターン (文法規則をクラスで表現したものを用い構文解析し, その結果に基づき処理を実行していく機能を提供する) — WTOPIA v1.0 documentation