Interpreter Pattern — Интерпретатор
Парсинг и интерпретация языка/DSL: токенизация → AST → выполнение. От валидации email до собственного языка программирования.
Проблема
Нужно понимать структурированный текст:
- проверить адрес/email/телефон/SQL
- выполнить выражение в шаблонизаторе
- интерпретировать DSL (свой язык)
- разобрать конфиг
Регулярки решают только примитивы; для иерархических структур нужен парсер.
Решение
- Грамматика языка описывается классами (по одному на токен/правило).
- Парсер строит AST (Abstract Syntax Tree).
- Интерпретатор обходит AST, выполняя каждый узел.
Пример в JS
// Минимальный интерпретатор арифметики
class NumLiteral { constructor(v) { this.v = v; } eval { return this.v; } }
class Add {
constructor(l, r) { this.l = l; this.r = r; }
eval { return this.l.eval + this.r.eval; }
}
class Mul {
constructor(l, r) { this.l = l; this.r = r; }
eval { return this.l.eval * this.r.eval; }
}
// AST для (2 + 3) * 4
const ast = new Mul(new Add(new NumLiteral(2), new NumLiteral(3)), new NumLiteral(4));
ast.eval; // 20
Где используется в JS-экосистеме
- JSON.parse — простейший interpreter
- Babel/SWC — парсят JS, строят AST, трансформируют
- PostCSS — AST для CSS
- Handlebars/EJS — интерпретация шаблонов
- GraphQL parser — query → AST → execution
- Regex engine — внутренний interpreter регулярок
Подводные камни
- Полноценный парсер дорого писать вручную — используют PEG.js, nearley, chevrotain.
- eval/new Function — встроенный interpreter JS, но опасный (XSS).
- В JS можно делать ограниченные DSL через template tags:
html`<div>${x}</div>`. - AST + Visitor — естественная пара (Visitor обходит дерево).
Главные тезисы автора
- «Целая машинерия абстрактного синтаксического дерева, интерпретатора, DSL».
- От простой валидации (адрес, телефон) до полноценного языка (Lisp, ограниченный JS).
- автор писал транслятор LISP в JavaScript с компиляцией в байткод V8 — пример интерпретатора.
- Интерпретатор обычно идёт в паре с Visitor — обход AST.
🎓 Источники
- 🎓 GoF Patterns Обзор всех паттернов · 2025-04-29
- От валидации адреса до Lisp/JavaScript
- Машинерия AST + interpreter + DSL
- 🎓 Транслятор LISP в JavaScript · 2025-02-08
- Пример реализации интерпретатора