В чем разница между деревьями синтаксического анализа и абстрактными деревьями синтаксиса?

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

Я искал в интернете и обнаружил, что деревья синтаксического анализа также называются конкретными деревьями синтаксиса (CSTs).

5 ответов


это основано на Выражение Оценщика грамматика Терренса Парра.

грамматика для этого примера:

grammar Expr002;

options 
{
    output=AST;
    ASTLabelType=CommonTree; // type of $stat.tree ref etc...
}

prog    :   ( stat )+ ;

stat    :   expr NEWLINE        -> expr
        |   ID '=' expr NEWLINE -> ^('=' ID expr)
        |   NEWLINE             ->
        ;

expr    :   multExpr (( '+'^ | '-'^ ) multExpr)*
        ; 

multExpr
        :   atom ('*'^ atom)*
        ; 

atom    :   INT 
        |   ID
        |   '('! expr ')'!
        ;

ID      : ('a'..'z' | 'A'..'Z' )+ ;
INT     : '0'..'9'+ ;
NEWLINE : '\r'? '\n' ;
WS      : ( ' ' | '\t' )+ { skip(); } ;

вход

x=1
y=2
3*(x+y)

Дерева

дерево синтаксического анализа является конкретным представлением входных данных. Дерево синтаксического анализа сохраняет всю информацию входных данных. Пустые поля представляют собой пробелы, т. е. конец строки.

Parse Tree

АСТ

AST является абстрактным представление входных данных. Обратите внимание, что parens не присутствуют в AST, потому что ассоциации выводятся из древовидной структуры.

AST

редактировать

для более подробного объяснения см. компиляторы и генераторы компиляторов П. Д. Терри pg. 23. Также смотрите авторов Домашняя страница для других элементов, таких как исходный код.


вот объяснение обработать деревья (конкретные деревья синтаксиса, CSTs) и абстрактные синтаксические деревья (ASTs), в контексте построения компилятора. Они похожи на структуры данных, но они построены по-разному и используются для разных задач.

обработать деревья

деревья разбора обычно генерируются как следующий шаг после лексического анализа (который превращает исходный код в ряд токенов, которые можно рассматривать как значимые единиц, а не просто последовательность символов).

они являются древовидными структурами данных, которые показывают, как входная строка терминалов (маркеры исходного кода) была сгенерирована грамматикой рассматриваемого языка. Корень дерева синтаксического анализа является наиболее общим символом грамматики - начальным символом (например,сообщении), а внутренние узлы представляют собой нетерминальные символы, к которым расширяется символ запуска (может включать сам символ запуска), такие как as выражение, сообщении, термин, вызов функции. Листья-это терминалы грамматики, фактические символы, которые отображаются как идентификаторы, ключевые слова и константы в строке языка / ввода, например на, 9, если, etc.

во время синтаксического анализа компилятор также выполняет различные проверки для обеспечения правильности синтаксиса-и отчеты об ошибках синтаксиса могут быть встроен в код парсера.

их можно использовать для синтаксического перевода через синтаксические определения или схемы перевода, для простых задач, таких как преобразование выражения infix в постфиксное.

вот графическое представление дерева синтаксического анализа для выражения 9 - 5 + 2 (обратите внимание на размещение терминалов в дереве и фактические символы из строки выражения):

enter image description here

абстрактного синтаксиса деревья!--17-->

ASTs представляют синтаксический структура кода. Деревья конструкций программирования, такие как выражения, операторы управления потоком и т. д., сгруппированы в операторы (внутренние узлы) и операнды (листья). Например, дерево синтаксиса для выражения i + 9 будет иметь оператор + как корень, переменная i как левый дочерний оператор, так и число 9 как правильный ребенок.

разница в том, что нетерминалы и терминалы не играют роли, так как AST не имеют дело с грамматиками и генерацией строк, а программируют конструкции, и, таким образом, они представляют отношения между такими конструкциями, а не способы, которыми они генерируются грамматикой.

обратите внимание, что сами операторы являются программными конструкциями на данном языке и не должны быть фактическими вычислительными операторами (например,+ is):for петли также будут обработаны таким образом. Например, у вас может быть синтаксическое дерево, такое как for [ expr, expr, expr, stmnt ] (представлено inline), где for это оператор, а элементы внутри квадратных скобок-это его дочерние элементы (представляющие C for синтаксис) - также состоит из операторов и т. д.

ASTs обычно генерируются компиляторами на этапе синтаксического анализа (синтаксического анализа), а также используются позже для семантического анализа, промежуточного представления, генерации кода и т. д.

вот графическое представление АСТ:

enter image description here


AST концептуально описывает исходный код, он не должен содержать все синтаксические элементы, необходимые для анализа некоторого исходного кода (фигурные скобки, ключевые слова, скобки и т. д.).

дерево синтаксического анализа представляет исходный код более близко.

в AST узел для оператора IF может содержать только три дочерних элемента:

  • условие
  • В Случае
  • Другое Дело

для C-подобного языка синтаксический анализ Дерево также должно содержать узлы для ключевого слова "if", скобки, фигурные скобки.


Я нашел это в интернете, возможно, полезно:

дерево разбора-это запись правил (и токенов), используемых для сопоставления некоторых ввод текста, в то время как дерево синтаксиса записывает структуру ввода и нечувствителен к грамматике, которая его породила. Обратите внимание, что там бесконечное число грамматик для любого одного языка и, следовательно, каждый грамматику было разобрать данную форму дерева введите предложение из-за всех различных промежуточных правил. - абстрактное синтаксическое дерево-это намного превосходящая промежуточная форма из-за этой нечувствительности и потому, что она подчеркивает структуру языка, а не грамматики.


Википедия говорит

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

ответ на Quora говорит

дерево синтаксического анализа-это запись правил (и токенов), используемых для сопоставления некоторого входного текста, тогда как дерево синтаксиса записывает структуру ввода и нечувствительно к грамматике, которая произвела он.

объединение двух вышеуказанных определений,

An Abstract Syntax Tree описывает дерево синтаксического анализа логически. Он не должен содержать все синтаксические конструкции, необходимые для анализа некоторого исходного кода (пробелы, фигурные скобки, ключевые слова, скобки и т. д.). Вот почему Parse Tree называют Concrete Syntax Tree в то время как AST называется Syntax Tree. Выход синтаксического анализатора, таким образом, фактически является синтаксическим деревом.