インタプリタパターンは、特定の言語の文法を定義し、その文法に基づいて文字列を解釈するためのデザインパターンです。このパターンは、構文解析や評価が必要な場合に役立ちます。特に、簡単な言語や表現を解釈する際に使われます。
インタプリタパターンは、以下のコンポーネントから構成されます。
ここでは、簡単な数学式(加算と減算)のインタプリタを実装します。数式は「数1 + 数2 - 数3」のように表現されます。
まず、抽象表現を定義します。
class Expression:
def interpret(self, context):
pass
次に、終端表現を定義します。数値を表すクラスを作成します。
class Number(Expression):
def __init__(self, number):
self.number = number
def interpret(self, context):
return self.number
次に、加算と減算を表現する非終端表現を作成します。
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)
この例ではコンテキストは不要ですが、将来的に拡張する際には役立ちます。
最後に、実際にインタプリタを使用するクライアントコードを作成します。
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
関数では、数式を組み立てて解釈し、結果を出力します。このようにして、インタプリタパターンを用いて数式を解釈することができます。実際のアプリケーションでは、もっと複雑な文法や演算をサポートすることができますが、基本的な考え方はこのようになります。