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.

🎓 Источники

См. также