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