🐹

Interpreter

2023/09/10に公開

Interpreter パターンは、特定のタスクのための言語を解釈するための表現を定義し、それを使用して文を解釈するための解釈機を使用するデザインパターンです。これは主に、繰り返し発生する問題のための簡単な言語を作成する場合に使用されます。

主要な構成要素:

  1. AbstractExpression (抽象表現): すべての具体的な表現の共通の操作を定義するインターフェースや抽象クラス。
  2. TerminalExpression (終端表現): 文中の終端記号を表す。
  3. NonTerminalExpression (非終端表現): 文中の非終端記号を表す。
  4. Context (文脈): 解釈を行う際の情報や状態を持つ。
  5. Client (クライアント): 文の構造を定義する。

例:

簡単な数式(加算や減算)の解釈を考えてみましょう。

  1. AbstractExpression:

    from abc import ABC, abstractmethod
    
    class Expression(ABC):
        @abstractmethod
        def interpret(self, context):
            pass
    
    
  2. TerminalExpression:

    class Number(Expression):
        def __init__(self, number):
            self.number = number
    
        def interpret(self, context):
            return self.number
    
    
  3. NonTerminalExpression:

    class Add(Expression):
        def __init__(self, left_expression, right_expression):
            self.left_expression = left_expression
            self.right_expression = right_expression
    
        def interpret(self, context):
            return self.left_expression.interpret(context) + self.right_expression.interpret(context)
    
    class Subtract(Expression):
        def __init__(self, left_expression, right_expression):
            self.left_expression = left_expression
            self.right_expression = right_expression
    
        def interpret(self, context):
            return self.left_expression.interpret(context) - self.right_expression.interpret(context)
    
    

使用方法:

    context = {}

    add_expression = Add(Number(5), Number(3))
    subtract_expression = Subtract(Number(5), Number(3))

    print(add_expression.interpret(context))        # 8
    print(subtract_expression.interpret(context))   # 2

利点:

  1. 拡張性: 新しい文法のルールや操作を追加することが容易です。新しい表現クラスを追加するだけで済みます。
  2. 再帰的な構造: 文法が再帰的な場合にも適用が容易です。

制約:

  1. 複雑性: シンプルな文法に対しては過剰に複雑になる恐れがあります。
  2. 効率: インタープリタが繰り返し実行される場合、効率が低くなる可能性があります。

Interpreter パターンは、簡単な文法や特定の繰り返し問題に対して専用の言語を作成する場合に使用されます。しかし、複雑な文法や言語を解釈するためには通常、パーサジェネレータやレキシカルアナライザなどの専用ツールを使用する方が効果的です。

Discussion