Section 10 / 13
インタプリタパターン
インタプリタパターンは、特定の言語の文法を定義し、その文法に基づいて文字列を解釈するためのデザインパターンです。このパターンは、構文解析や評価が必要な場合に役立ちます。特に、簡単な言語や表現を解釈する際に使われます。
インタプリタパターンの基本構造
インタプリタパターンは、以下のコンポーネントから構成されます。
- 抽象表現(Abstract Expression): インタプリタのインターフェースを定義します。
- 終端表現(Terminal Expression): 文法の終端要素を表現します。
- 非終端表現(Nonterminal Expression): 文法の非終端要素を表現します。
- コンテキスト(Context): 解釈時に必要な情報を提供します。
サンプルコード
ここでは、簡単な数学式(加算と減算)のインタプリタを実装します。数式は「数1 + 数2 - 数3」のように表現されます。
ステップ1: 抽象表現の定義
まず、抽象表現を定義します。
class Expression:
def interpret(self, context):
pass
ステップ2: 終端表現の定義
次に、終端表現を定義します。数値を表すクラスを作成します。
class Number(Expression):
def __init__(self, number):
self.number = number
def interpret(self, context):
return self.number
ステップ3: 非終端表現の定義
次に、加算と減算を表現する非終端表現を作成します。
class Add(Expression):
def __init__(self, left, right):
self.left = left
self.right = right
def interpret(self, context):
return self.left.interpret(context) + self.right.interpret(context)
class Subtract(Expression):
def __init__(self, left, right):
self.left = left
self.right = right
def interpret(self, context):
return self.left.interpret(context) - self.right.interpret(context)
ステップ4: コンテキストの定義
この例ではコンテキストは不要ですが、将来的に拡張する際には役立ちます。
ステップ5: インタプリタのクライアントコード
最後に、実際にインタプリタを使用するクライアントコードを作成します。
def main():
# 表現を構築する
expr = Subtract(Add(Number(10), Number(5)), Number(3))
# 解釈する
result = expr.interpret({})
print(f"Result: {result}")
if __name__ == "__main__":
main()
コードの解説
- 抽象表現:
Expressionクラスは、解釈メソッドを持つ基本クラスです。 - 終端表現:
Numberクラスは数値を表し、解釈すると数値を返します。 - 非終端表現:
Addクラスは加算を、Subtractクラスは減算を実装しています。どちらのクラスも左右の表現を解釈し、その結果を計算します。 - クライアントコード:
main関数では、数式を組み立てて解釈し、結果を出力します。
このようにして、インタプリタパターンを用いて数式を解釈することができます。実際のアプリケーションでは、もっと複雑な文法や演算をサポートすることができますが、基本的な考え方はこのようになります。