<一覧に戻る

インタプリタパターン

インタプリタパターンは、特定の言語の文法を定義し、その文法に基づいて文字列を解釈するためのデザインパターンです。このパターンは、構文解析や評価が必要な場合に役立ちます。特に、簡単な言語や表現を解釈する際に使われます。

インタプリタパターンの基本構造

インタプリタパターンは、以下のコンポーネントから構成されます。

  1. 抽象表現(Abstract Expression): インタプリタのインターフェースを定義します。
  2. 終端表現(Terminal Expression): 文法の終端要素を表現します。
  3. 非終端表現(Nonterminal Expression): 文法の非終端要素を表現します。
  4. コンテキスト(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()

コードの解説

  1. 抽象表現: Expression クラスは、解釈メソッドを持つ基本クラスです。
  2. 終端表現: Number クラスは数値を表し、解釈すると数値を返します。
  3. 非終端表現: Add クラスは加算を、Subtract クラスは減算を実装しています。どちらのクラスも左右の表現を解釈し、その結果を計算します。
  4. クライアントコード: main 関数では、数式を組み立てて解釈し、結果を出力します。

このようにして、インタプリタパターンを用いて数式を解釈することができます。実際のアプリケーションでは、もっと複雑な文法や演算をサポートすることができますが、基本的な考え方はこのようになります。

出力結果: