Они генерируются на разных этапах процесса компиляции? Или это просто разные названия одного и того же?
Они генерируются на разных этапах процесса компиляции? Или это просто разные названия одного и того же?
Ответы:
Это основано на грамматике 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)
Дерево разбора
Дерево синтаксического анализа - это конкретное представление ввода. Дерево синтаксического анализа сохраняет всю информацию о вводе. Пустые поля представляют собой пробел, то есть конец строки.
AST
AST - это абстрактное представление ввода. Обратите внимание, что парные скобки отсутствуют в AST, поскольку ассоциации выводятся из древовидной структуры.
Для более подробного объяснения см. Компиляторы и генераторы компиляторов стр. 23
или абстрактные синтаксические деревья на стр. 21 в синтаксисе и семантике языков программирования
Насколько я понимаю, AST больше фокусируется на абстрактных отношениях между компонентами исходного кода, в то время как дерево синтаксического анализа фокусируется на фактической реализации грамматики, используемой языком, включая мелкие детали. Это определенно не одно и то же, поскольку другой термин для «дерева разбора» - «конкретное дерево синтаксиса».
Я нашел эту страницу, которая пытается решить именно этот вопрос.
Книга DSL Мартина Фаулера прекрасно объясняет это. AST содержит только все `` полезные '' элементы, которые будут использоваться для дальнейшей обработки, в то время как дерево синтаксического анализа содержит все артефакты (пробелы, скобки, ...) из исходного документа, который вы анализируете.
Возьмите задание на паскаль Возраст: = 42;
Синтаксическое дерево будет выглядеть так же, как исходный код. Ниже я заключил узлы в скобки. [Возраст] [: =] [42] [;]
Абстрактное дерево будет выглядеть так [=] [Возраст] [42]
Назначение становится узлом с 2 элементами, возрастом и 42. Идея состоит в том, что вы можете выполнить задание.
Также обратите внимание, что синтаксис паскаль исчезает. Таким образом, один и тот же AST может генерироваться более чем одним языком. Это полезно для межъязыковых скриптовых машин.
В дереве разбора внутренние узлы нетерминальные, листья терминальные. В синтаксическом дереве внутренние узлы являются операторами, а листья - операндами.