Un albero di sintassi concreto corrisponde a ciò che le regole grammaticali dicono è la sintassi. Lo scopo dell'albero della sintassi astratto è avere una rappresentazione "semplice" di ciò che è essenziale "nell'albero della sintassi".
Un valore reale nell'AST IMHO è che è più piccolo del CST e quindi richiede meno tempo per l'elaborazione. (Potresti dire, chi se ne frega? Ma lavoro con uno strumento in cui abbiamo decine di milioni di nodi che vivono contemporaneamente!).
La maggior parte dei generatori di parser che hanno supporto per la costruzione di alberi di sintassi insistono che tu specifichi personalmente esattamente come vengono costruiti partendo dal presupposto che i tuoi nodi ad albero saranno "più semplici" del CST (e in questo, hanno generalmente ragione, dato che i programmatori sono carini pigro). Probabilmente significa che devi codificare meno funzioni del visitatore dell'albero, e questo è anche prezioso, in quanto riduce al minimo l'energia di ingegneria. Quando hai 3500 regole (ad esempio, per COBOL) questo è importante. E questa "semplicità" conduce alla buona proprietà della "piccolezza".
Ma avere tali AST crea un problema che non c'era: non corrisponde alla grammatica, e ora devi tracciarli mentalmente entrambi. E quando ci sono 1500 nodi AST per una grammatica di 3500 regole, questo conta molto. E se la grammatica si evolve (lo fanno sempre!), Ora hai due serie gigantesche di cose da tenere sincronizzate.
Un'altra soluzione è lasciare che il parser crei semplicemente i nodi CST per te e li usi. Questo è un enorme vantaggio quando si costruiscono le grammatiche: non è necessario inventare 1500 nodi AST speciali per modellare 3500 regole grammaticali. Basti pensare che l'albero è isomorfo alla grammatica. Dal punto di vista dell'ingegnere grammaticale questo è completamente senza cervello, il che gli consente di concentrarsi sull'ottenere la grammatica giusta e su come farlo a suo piacimento. Probabilmente devi scrivere più regole per i visitatori del nodo, ma questo può essere gestito. Ne parleremo più avanti.
Quello che facciamo con il DMS Software Reengineering Toolkit è creare automaticamente un CST basato sui risultati di un processo di analisi (GLR). DMS quindi costruisce automaticamente un CST "compresso" per ragioni di efficienza dello spazio, eliminando terminali non portatori di valore (parole chiave, punteggiatura), produzioni unarie semanticamente inutili e formando elenchi per coppie di regole grammaticali che sono elenchi come:
L = e ;
L = L e ;
L2 = e2 ;
L2 = L2 ',' e2 ;
e un'ampia varietà di variazioni di tali forme. Pensi in termini di regole grammaticali e CST virtuale; lo strumento opera sulla rappresentazione compressa. Facile per il tuo cervello, più veloce / più piccolo in fase di esecuzione.
Sorprendentemente, il CST compresso costruito in questo modo sembra molto un AST che potresti aver progettato a mano (vedi il collegamento alla fine degli esempi). In particolare, il CST compresso non contiene nodi che siano solo sintassi concreta. Ci sono pezzi minori di disagio: per esempio, mentre i nodi concreti per '(' e ')' classicamente disponibili a subgrammars espressione non sono nella struttura, una "parentesi nodo" non appare nella CST compresso e deve essere gestito. Un vero AST non lo avrebbe. Questo sembra un prezzo piuttosto basso da pagare per la comodità di non dover specificare la costruzione AST, mai. E la documentazione per l'albero è sempre disponibile e corretta: la grammatica è la documentazione.
Come si evitano i "visitatori extra"? Non lo facciamo del tutto, ma DMS fornisce una libreria AST che controlla l'AST e gestisce le differenze tra CST e AST in modo trasparente. DMS offre anche un valutatore di "grammatica degli attributi" (AGE), che è un metodo per passare valori calcolati a nodi su e giù per l'albero; l'AGE gestisce tutti i problemi di rappresentazione ad albero e quindi l'ingegnere dello strumento si preoccupa solo di scrivere i calcoli in modo efficace direttamente sulle regole grammaticali stesse. Infine, DMS fornisce anche modelli di "sintassi superficiale", che consentono di utilizzare frammenti di codice dalla grammatica per trovare tipi specifici di sottostrutture, senza conoscere la maggior parte dei tipi di nodi coinvolti.
Una delle altre risposte osserva che se vuoi costruire strumenti in grado di rigenerare la sorgente, il tuo AST dovrà corrispondere al CST. Non è proprio vero, ma è molto più facile rigenerare la sorgente se si hanno nodi CST. DMS genera automaticamente la maggior parte di prettyprinter perché ha accesso a entrambi: -}
Conclusione: gli AST vanno bene per i piccoli, sia fisici che concettuali. La costruzione AST automatizzata dal CST fornisce entrambi e consente di evitare il problema di tracciare due set diversi.
EDIT Marzo 2015: collegamento ad esempi di CST e "AST" costruiti in questo modo