Синтаксическое дерево04 / 19

AST: структура вместо строки

Почему 2 + 3 * 4 и (2 + 3) * 4 — разные программы.

В предыдущем уроке сканер разбил исходный текст на токены. Теперь парсер разбирает эти токены по грамматике JavaScript и строит абстрактное синтаксическое дерево (Abstract Syntax Tree, AST).

Узлы дерева представляют конструкции программы: объявления переменных, вызовы функций, операции. Связи между узлами показывают, как эти конструкции вложены друг в друга.

Рассмотрим выражение 2 + 3 * 4. В его дереве верхняя операция — сложение, а её правый операнд — результат умножения. В (2 + 3) * 4 верхней операцией становится умножение.

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

const first = 2 + 3 * 4;   // 14
const second = (2 + 3) * 4; // 20

ECMA-262 задаёт грамматику и семантику выражений, но не требует от всех движков одинакового AST. Это важно и при работе с AST-инструментами: дерево Babel или ESTree не обязано совпадать с внутренним деревом V8.

Сначала определим, как изменится дерево при добавлении скобок. Затем переключим выражение и сравним результат со схемой.

Одни числа. Два дерева.

При изменении группировки меняются верхний оператор и результат.

КОРЕНЬ
+Сложение
ЛЕВЫЙ ОПЕРАНД
2Литерал
ПРАВЫЙ ОПЕРАНД
×Умножение
34
РЕЗУЛЬТАТ2 + (3 × 4) = 14

Корень — +. Справа сначала вычисляется 3 × 4, затем 2 + 12.

1 / 2
Основной вывод

AST представляет программу как дерево: узлы описывают её конструкции, а связи — их вложенность. В V8 это дерево служит основой для генерации байткода.

Проверить по первоисточнику ↗

ECMA-262 · Additive Operators↗Грамматика сложения использует multiplicative expressions и задаёт группировку.V8 · Scanner↗Команда V8 о токенизации и пути от текста к AST.