Qual è la differenza tra albero di analisi e AST?


90

Sono generati da diverse fasi di un processo di compilazione? O sono solo nomi diversi per la stessa cosa?


Parse Tree è il risultato della tua grammatica con i suoi artefatti (puoi scrivere un'infinità di grammatiche per la stessa lingua), un AST riduce il Parse Tree il più vicino possibile alla lingua. Diverse grammatiche per la stessa lingua forniranno alberi di analisi diversi ma dovrebbero risultare nello stesso AST. (puoi anche ridurre script diversi (alberi di analisi diversi dalla stessa grammatica) allo stesso AST)
Guillaume86

1
Questa risposta così discute la dfference in dettaglio: stackoverflow.com/a/1916687/120163
Ira Baxter

Risposte:


95

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.

Parse Tree

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.

AST

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


5
Come si ricava l'AST dall'albero di analisi? Qual è il metodo per semplificare un albero di analisi in un AST?
CMCDragonkai

3
Non esiste un algoritmo specifico per derivare l'AST dall'albero di analisi. Ciò che entra nell'AST è più una preferenza personale, ma deve contenere informazioni sufficienti per svolgere l'attività. Ho escluso i genitori dall'AST utilizzando l'ANTLR ! operatore nella grammatica poiché non sono necessari, ma per impostazione predefinita ANTLR li avrebbe inclusi. Penso che l'albero di analisi ti dia tutto, che tu ne abbia bisogno o meno, e l'AST ti dia il minimo indispensabile. Ricorda che attraverserai molto gli alberi, quindi le dimensioni contano.
Guy Coder

2
Vuoi dire come CST (albero di sintassi concreto) vs AST (albero di sintassi astratto)?
CMCDragonkai

Le azioni / regole semantiche incorporate nei file di sintassi di un parser o generatore di parser sono il modo usuale di analisi semantica e creazione di un AST, mentre l'albero di analisi è raramente, se non mai, costruito o utilizzato dal codice utente, tranne forse per la verifica della correttezza del parser.


16

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.


11

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


4

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.


1

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.