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.
Сначала определим, как изменится дерево при добавлении скобок. Затем переключим выражение и сравним результат со схемой.