[파이썬] 인터프리터 패턴과 언어 해석

인터프리터 패턴은 소프트웨어 디자인 패턴 중 하나로, 언어 해석과 실행을 담당하는 구조를 구현하는 방법입니다. 이 패턴은 입력된 문장을 구문 분석하고 해석하여 원하는 동작을 수행하는 데 사용됩니다.

언어 해석과 실행

어떤 프로그래밍 언어든지 해당 언어의 문법에 맞게 작성된 문장을 해석하고 실행해야 합니다. 예를 들어, 파이썬의 경우 다음과 같은 코드를 실행하면서 해석을 수행합니다.

print("Hello, World!")

이 코드는 파이썬 인터프리터에 의해 해석되고, “Hello, World!”라는 메시지가 출력됩니다. 이러한 언어 해석과 실행 과정은 복잡할 수 있으며, 소프트웨어의 유연성과 확장성에 영향을 미칠 수 있습니다.

인터프리터 패턴의 구조

인터프리터 패턴은 다음과 같은 주요 구성 요소로 구성됩니다:

from abc import ABC, abstractmethod

# 추상 표현 클래스
class AbstractExpression(ABC):
    @abstractmethod
    def interpret(self, context):
        pass

# 종단 표현 클래스
class TerminalExpression(AbstractExpression):
    def interpret(self, context):
        # 실제 해석 로직 작성
        pass

# 비-종단 표현 클래스
class NonTerminalExpression(AbstractExpression):
    def __init__(self, expressions):
        self.expressions = expressions

    def interpret(self, context):
        # 여러 개의 터미널 문장을 해석 및 조합하여 동작 수행
        pass

# 컨텍스트 클래스
class Context:
    pass

예제: 사칙연산 언어 해석기

간단한 예제로 사칙연산 언어 해석기를 만들어보겠습니다. 이 언어는 덧셈과 뺄셈만을 지원하며, 문장의 해석은 각각의 연산과 피연산자를 수행하여 결과값을 반환합니다.

class TerminalExpression(AbstractExpression):
    def __init__(self, value):
        self.value = value

    def interpret(self, context):
        return self.value

class NonTerminalExpression(AbstractExpression):
    def __init__(self, left, right, operator):
        self.left = left
        self.right = right
        self.operator = operator

    def interpret(self, context):
        if self.operator == '+':
            return self.left.interpret(context) + self.right.interpret(context)
        elif self.operator == '-':
            return self.left.interpret(context) - self.right.interpret(context)
        else:
            raise ValueError("Unsupported operator: {}".format(self.operator))

context = Context()

expression1 = NonTerminalExpression(TerminalExpression(3), TerminalExpression(2), '+')
result1 = expression1.interpret(context)
print(result1)  # Output: 5

expression2 = NonTerminalExpression(TerminalExpression(5), TerminalExpression(2), '-')
result2 = expression2.interpret(context)
print(result2)  # Output: 3

이 예제에서는 TerminalExpression 클래스가 숫자를 해석하고 결과값을 반환하며, NonTerminalExpression 클래스는 덧셈과 뺄셈 연산을 해석하여 결과값을 반환합니다. Context 클래스는 현재 실행 컨텍스트를 나타내는 데 사용됩니다.

인터프리터 패턴을 사용하면 간단한 언어 해석기를 구현할 수 있으며, 이를 활용하여 복잡한 문장을 해석하고 동작을 수행할 수 있습니다. 실제로 많은 언어 해석기가 인터프리터 패턴을 기반으로 구현되어 있습니다.