it-roy-ru.com

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

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

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

42
Shashi Bhushan

Это основано на Expression Evaluator грамматике Терренса Парра.

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

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

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

AST

Правка 

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

27
Guy Coder

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

Разбирать деревья

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

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

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

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

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

enter image description here

Абстрактные синтаксические деревья

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

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

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

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

Вот графическое представление AST:

enter image description here

14
corazza

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

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

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

  • Состояние
  • Если дело
  • Остальное дело

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

5
jjwchoy

Я нашел это в Интернете, может быть, полезно:

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

3
Khatri

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

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

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

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

Объединяя два приведенных выше определения,

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

0
Palak Jain