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

Что это такое

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

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


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

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

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

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

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

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

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

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


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

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

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