Sono generati da diverse fasi di un processo di compilazione? O sono solo nomi diversi per la stessa cosa?
Sono generati da diverse fasi di un processo di compilazione? O sono solo nomi diversi per la stessa cosa?
Risposte:
Questo si basa sulla grammatica Expression Evaluator di Terrence Parr.
La grammatica per questo esempio:
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(); } ;
Ingresso
x=1
y=2
3*(x+y)
Parse Tree
L'albero di analisi è una rappresentazione concreta dell'input. L'albero di analisi conserva tutte le informazioni dell'input. Le caselle vuote rappresentano gli spazi, cioè la fine della riga.
AST
L'AST è una rappresentazione astratta dell'input. Si noti che le parentesi non sono presenti nell'AST perché le associazioni sono derivabili dalla struttura ad albero.
Per una spiegazione più approfondita, vedere Compilatori e generatori di compilatori pag. 23
o alberi di sintassi astratti a pag. 21 in Sintassi e semantica dei linguaggi di programmazione
Da quanto ho capito, l'AST si concentra maggiormente sulle relazioni astratte tra i componenti del codice sorgente, mentre l'albero di analisi si concentra sull'effettiva implementazione della grammatica utilizzata dal linguaggio, inclusi i dettagli nitidi. Non sono decisamente la stessa cosa, poiché un altro termine per "albero sintattico" è "albero sintattico concreto".
Ho trovato questa pagina che tenta di risolvere questa domanda esatta.
Il libro DSL di Martin Fowler lo spiega bene. L'AST contiene solo tutti gli elementi 'utili' che verranno utilizzati per ulteriori elaborazioni, mentre l'albero di analisi contiene tutti gli artefatti (spazi, parentesi, ...) dal documento originale che analizzi
Prendi l'assegnazione pascal Età: = 42;
L'albero della sintassi sarebbe simile al codice sorgente. Di seguito metto parentesi attorno ai nodi. [Età] [: =] [42] [;]
Un albero astratto sarebbe simile a questo [=] [Età] [42]
L'assegnazione diventa un nodo con 2 elementi, Età e 42. L'idea è che tu possa eseguire l'assegnazione.
Notare inoltre che la sintassi pascal scompare. Quindi è possibile che più di una lingua generi lo stesso AST. Ciò è utile per i motori di script multilingue.
Nell'albero di analisi i nodi interni non sono terminali, le foglie sono terminali. Nell'albero della sintassi i nodi interni sono operatori, le foglie sono operandi.