Eles são gerados por diferentes fases de um processo de compilação? Ou são apenas nomes diferentes para a mesma coisa?
Eles são gerados por diferentes fases de um processo de compilação? Ou são apenas nomes diferentes para a mesma coisa?
Respostas:
Isso se baseia na gramática do Expression Evaluator, de Terrence Parr.
A gramática para este exemplo:
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(); } ;
Entrada
x=1
y=2
3*(x+y)
Analisar árvore
A árvore de análise é uma representação concreta da entrada. A árvore de análise retém todas as informações da entrada. As caixas vazias representam espaços em branco, ou seja, fim de linha.
AST
O AST é uma representação abstrata da entrada. Observe que os parênteses não estão presentes no AST porque as associações são deriváveis da estrutura em árvore.
Para uma explicação mais detalhada, consulte Compiladores e geradores de compiladores na pág. 23
ou Árvores de sintaxe abstrata na pág. 21 em Sintaxe e Semântica de Linguagens de Programação
Pelo que entendi, o AST se concentra mais nas relações abstratas entre os componentes do código-fonte, enquanto a árvore de análise se concentra na implementação real da gramática utilizada pela linguagem, incluindo os detalhes minuciosos. Eles definitivamente não são os mesmos, já que outro termo para "árvore de análise" é "árvore de sintaxe concreta".
Encontrei esta página que tenta resolver esta questão exata.
O livro DSL de Martin Fowler explica isso muito bem. O AST contém apenas todos os elementos 'úteis' que serão usados para processamento posterior, enquanto a árvore de análise contém todos os artefatos (espaços, colchetes, ...) do documento original que você analisa
Faça a atribuição pascal Idade: = 42;
A árvore de sintaxe seria semelhante ao código-fonte. Abaixo estou colocando colchetes ao redor dos nós. [Idade] [: =] [42] [;]
Uma árvore abstrata ficaria assim [=] [Idade] [42]
A atribuição se torna um nó com 2 elementos, Idade e 42. A ideia é que você possa executar a atribuição.
Observe também que a sintaxe pascal desaparece. Assim, é possível que mais de um idioma gere o mesmo AST. Isso é útil para motores de script entre idiomas.
Na árvore de análise, os nós internos são não terminais, as folhas são terminais. Na árvore de sintaxe, os nós internos são operadores e as folhas são operandos.