Вот объяснение деревьев разбора (конкретные синтаксические деревья, CST) и абстрактных синтаксических деревьев (AST) в контексте построения компилятора.Это схожие структуры данных, но они построены по-разному и используются для разных задач.
Деревья разбора
Деревья разбора обычно генерируются как следующий шаг после лексического анализа (который превращает источникзакодировать в серию токенов, которые можно рассматривать как значимые единицы, а не просто последовательность символов).
Это древовидные структуры данных, которые показывают, как вводится строка терминалов (токены исходного кода)был сгенерирован грамматикой рассматриваемого языка.Корень дерева разбора является наиболее общим символом грамматики - начальным символом (например, оператор ), а внутренние узлы представляют нетерминальные символы, в которые расширяется начальный символ (может включать начальный символсамо по себе), например выражение , выражение , term , вызов функции .Листья являются терминалами грамматики, фактическими символами, которые появляются в виде идентификаторов, ключевых слов и констант в строке языка / ввода, например, для , 9 , , если и т. Д.
При синтаксическом анализе компилятор также выполняет различные проверки, чтобы убедиться в правильности синтаксиса, и отчеты о синтаксических ошибках могут быть встроены в код синтаксического анализатора.
Они могут использоваться для синтаксиса-направленный перевод с помощью синтаксически-ориентированных определений или схем перевода для простых задач, таких как преобразование инфиксного выражения в постфиксное.
Вот графическое представление дерева разбора для выражения 9 - 5 + 2
(обратите внимание на размещениетерминалов в дереве и фактических символов из строки выражения):
Абстрактные деревья синтаксиса
AST представляют синтаксическую структурунекоторый код .Деревья программных конструкций, таких как выражения, операторы управления потоком и т. Д., Сгруппированы в операторы (внутренние узлы) и операнды (листья).Например, синтаксическое дерево для выражения i + 9
будет иметь оператор +
в качестве корня, переменную i
в качестве левого дочернего элемента оператора и число 9
в качестве правого дочернего элемента.
Различие здесь в том, что нетерминалы и терминалы не играют роли, поскольку AST не имеют дело с грамматиками и генерацией строк, но программируют конструкции, и, таким образом, они представляют отношения между такими конструкциями, а не способы, которые они генерируются грамматикой.
Обратите внимание, что сами операторы являются конструкциями программирования на данном языке и не должны быть фактическими вычислительными операторами (как +
is): циклы for
также будут обрабатываться таким образом.Например, у вас может быть синтаксическое дерево, такое как for [ expr, expr, expr, stmnt ]
(представлено встроенным), где for
является оператором , а элементы в квадратных скобках являются его дочерними элементами (представляющими синтаксис C for
).) - также состоит из операторов и т. д.
AST обычно генерируются компиляторами также на этапе синтаксического анализа (синтаксического анализа) и используются позже для семантического анализа, промежуточного представления, генерации кода и т. д.
Вот графическое представление AST: