[파이썬] 인터프리터 패턴과 언어 해석
인터프리터 패턴은 소프트웨어 디자인 패턴 중 하나로, 언어 해석과 실행을 담당하는 구조를 구현하는 방법입니다. 이 패턴은 입력된 문장을 구문 분석하고 해석하여 원하는 동작을 수행하는 데 사용됩니다.
언어 해석과 실행
어떤 프로그래밍 언어든지 해당 언어의 문법에 맞게 작성된 문장을 해석하고 실행해야 합니다. 예를 들어, 파이썬의 경우 다음과 같은 코드를 실행하면서 해석을 수행합니다.
print("Hello, World!")
이 코드는 파이썬 인터프리터에 의해 해석되고, “Hello, World!”라는 메시지가 출력됩니다. 이러한 언어 해석과 실행 과정은 복잡할 수 있으며, 소프트웨어의 유연성과 확장성에 영향을 미칠 수 있습니다.
인터프리터 패턴의 구조
인터프리터 패턴은 다음과 같은 주요 구성 요소로 구성됩니다:
- Abstract Expression (추상 표현): 해석에 사용될 수 있는 모든 문장에 대한 추상 클래스 또는 인터페이스입니다.
- Terminal Expression (종단 표현): 실제로 해석되는 터미널 문장을 나타내는 클래스입니다.
- Non-terminal Expression (비-종단 표현): 여러 개의 터미널 문장을 조합하여 복잡한 문장을 나타내는 클래스입니다.
- Context (컨텍스트): 문장의 해석에 필요한 전역 정보를 저장하는 역할을 수행하는 클래스입니다.
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
클래스는 현재 실행 컨텍스트를 나타내는 데 사용됩니다.
인터프리터 패턴을 사용하면 간단한 언어 해석기를 구현할 수 있으며, 이를 활용하여 복잡한 문장을 해석하고 동작을 수행할 수 있습니다. 실제로 많은 언어 해석기가 인터프리터 패턴을 기반으로 구현되어 있습니다.