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

Что это такое

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

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


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

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

Каждый узел вычисляет себя сам

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

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

Когда его применять

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

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


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

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

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