Назад к вопросам
Middle+
81
questionbank

Что такое паттерн проектирования Интерпретатор (Interpreter)?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Паттерн Интерпретатор (Interpreter) используется для определения грамматического представления языка и предоставляет интерпретатор для обработки предложений на этом языке.

Ключевые элементы:

  • Абстрактное синтаксическое дерево (Abstract Syntax Tree - AST): Структура данных, представляющая предложение языка.
  • Абстрактное выражение (AbstractExpression): Интерфейс или абстрактный класс для всех узлов AST. Он определяет операцию interpret().
  • Терминальное выражение (TerminalExpression): Конкретный класс, реализующий интерфейс AbstractExpression для терминальных символов грамматики.
  • Нетерминальное выражение (NonterminalExpression): Конкретный класс, реализующий интерфейс AbstractExpression для нетерминальных символов грамматики. Обычно содержит ссылки на другие выражения.
  • Контекст (Context): Хранит информацию, используемую в процессе интерпретации.

Применение:

  • Когда необходимо проанализировать и интерпретировать выражения на простом языке.
  • Когда грамматика языка относительно простая.

Преимущества:

  • Упрощает добавление новых способов интерпретации выражений.
  • Легко расширять грамматику.

Недостатки:

  • Может стать трудноуправляемым для сложных грамматик.
  • Создание AST может быть затратным.

Пример: Простая грамматика для арифметических выражений (сложение и вычитание)

# Абстрактное выражение
class AbstractExpression:
    def interpret(self, context):
        pass

# Терминальное выражение (Числа)
class NumberExpression(AbstractExpression):
    def __init__(self, value):
        self.value = value

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

# Нетерминальное выражение (Операция сложения)
class AddExpression(AbstractExpression):
    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 SubtractExpression(AbstractExpression):
    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

# Пример использования
# Создаем AST для выражения "5 + (3 - 2)"
ast = AddExpression(
    NumberExpression(5),
    SubtractExpression(NumberExpression(3), NumberExpression(2))
)

context = Context()
result = ast.interpret(context)
print(result) # Вывод: 6