Перейти к основному содержимому

Что это такое

Паттерн Интерпретатор (Interpreter) вычисляет выражения небольшого языка, строя дерево объектов-выражений — каждый узел знает, как интерпретировать сам себя. Числа интерпретируются в самих себя; узел сложения интерпретирует обе свои части и складывает их.

Он подходит для маленьких языков: фильтров, формул, простых правил. Настоящие языки заслуживают настоящих инструментов разбора.


Пример: крошечный калькулятор

Входная строка 3 + 4 - 2 превращается в дерево из узлов Number, Add и Subtract. Один вызов Interpret() на корне вычисляет всё выражение целиком.

Каждый узел интерпретирует сам себя

parse строит дерево слева направо; Interpret() обходит его. Поддержка * потребовала бы всего одного нового типа узла — существующие остались бы нетронутыми.

Prompt
Напишите программу на Go с паттерном Interpreter: интерфейс Expression с методом Interpret, узлы Number, Add и Subtract, а также функцию parse, которая превращает строку вроде "3 + 4 - 2" в дерево выражений слева направо. Интерпретируйте выражение и выведите равенство вместе с его результатом.
Вывод: программа на Go и захваченный вывод

Когда его использовать

Используйте его, когда пользователи или файлы настроек выражают логику на небольшом языке вашего собственного изобретения: фильтры поиска, формулы расчёта цен, правила проверки.

Откажитесь от него, когда «язык» — это три фиксированных варианта (возьмите switch) или, наоборот, настоящий язык (возьмите генератор парсеров или готовый движок).


Плюсы и минусы

Плюсы: грамматика отображается один к одному на небольшие типы; новые операции — это новые типы узлов; деревья выражений можно строить, проверять и переиспользовать.

Минусы: с ростом грамматики становится всё мучительнее; сам разбор всё равно нужно написать; производительность скромная по сравнению со скомпилированной логикой.