Middle+
100
questionbank
Что такое паттерн проектирования 'Интерпретатор'?
Ответ от нейросети
sobes.tech AI
Паттерн проектирования "Интерпретатор" используется для определения грамматического представления для языка и предоставляет интерпретатор этого представления. Паттерн полезен, когда существует простой язык и частая необходимость его интерпретации.
Основные компоненты паттерна:
- Абстрактное выражение (Abstract Expression): Объявляет абстрактную операцию
interpret, которая является общей для всех узлов в абстрактном синтаксическом дереве. - Терминальное выражение (Terminal Expression): Реализует операцию
interpretдля терминальных символов грамматики. Каждому терминальному символу соответствует один или несколько экземпляров классаTerminalExpression. - Нетерминальное выражение (Nonterminal Expression): Реализует операцию
interpretдля нетерминальных символов грамматики. Каждое правило грамматики может быть представлено таким классом. КлассNonterminalExpressionобычно хранит ссылки на другие объектыAbstractExpression(терминальные или нетерминальные). - Контекст (Context): Содержит информацию, общую для интерпретатора. Он может содержать состояние или операнды для интерпретации.
- Клиент (Client): Строит (или получает) абстрактное синтаксическое дерево, используя классы
TerminalExpressionиNonterminal Expression, и вызывает операциюinterpret.
Пример использования: парсинг и вычисление простых арифметических выражений.
# Абстрактное выражение
class Expression:
def interpret(self, context):
pass
# Терминальное выражение: числа
class Number(Expression):
def __init__(self, value):
self.value = value
def interpret(self, context):
return self.value
# Нетерминальное выражение: сложение
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)
# Контекст (может быть простым словарем для переменных и т.д.)
class Context:
pass
# Клиентский код
context = Context()
tree = Add(Number(5), Subtract(Number(10), Number(2))) # 5 + (10 - 2)
result = tree.interpret(context)
print(result) # Вывод: 13
Преимущества:
- Легко добавлять новые интерпретации или расширять грамматику.
- Грамматика представлена в виде классов, что облегчает ее понимание.
Недостатки:
- Может стать сложным, если грамматика очень большая или сложная. В таких случаях может быть предпочтительнее использовать другие методы парсинга.