Ho fatto ricerche sui compilatori. Il lexer sembra essere molto semplice: prendi una "frase" e suddividila in parole (o token). Per garantire la grammatica corretta è necessario un parser. Generalmente il parser prende i token e costruisce un albero che risulta in un nodo radice (parole in frasi, paragrafi, pagine, ecc ...).Quando utilizzare un albero di sintassi astratto o concreto?
Da this question sembrerebbe che un parser creerebbe un AST. L'AST contiene solo ciò che è necessario per eseguire il codice, quindi elementi come parentesi non sarebbero necessari poiché la precedenza degli operatori è incorporata in un AST. Un AST è probabilmente tutto un bisogno di compilatore.
Ma per quanto riguarda la conversione del codice da una lingua all'altra? Prendere una lingua preparata (grammatica) o una grammatica esistente e convertirla in un'altra in cui le regole di precedenza degli operatori possono o meno essere diverse? La precedenza dell'operatore è "incorporata" anche nel CST?
Ad esempio, diciamo che ho inventato una lingua e volevo tradurla in codice PHP. L'operatore ternario nella maggior parte delle lingue ha associatività da destra a sinistra. PHP utilizza erroneamente associatività da sinistra a destra (see more about this here). Voglio che la "mia lingua" utilizzi da destra a sinistra, ma il codice PHP risultante deve applicare la parentesi per ottenere il risultato corretto in PHP (con lo link to Wikipedia, il risultato deve essere "treno" anziché "cavallo").
Quindi per la traduzione linguistica un CST sarebbe migliore? La precedenza dell'operatore è solitamente incorporata in un CST? C'è qualcosa in mezzo? Esistono esempi che confrontino entrambi gli alberi con una semplice equazione algebrica? Qualche esempio che illustra un operatore ternario?
(Is "transcodifica" il termine corretto per "traduzione linguaggio di programmazione" Una ricerca su Google porta in primo piano la conversione dei media?).
Quello che sto cercando di capire è: quando è più opportuno utilizzare uno sull'altro?
Non vedo perché è necessario l'albero di sintassi concreto per una traduzione da lingua a lingua. La sintassi concreta è esattamente ciò che è più probabile che differisca. Vuoi creare un programma con * semantica * simile in un'altra lingua, per questo hai bisogno solo della * semantica * del programma originale, e l'AST ti dà proprio quello con meno confusione. – delnan
Ah, capisco cosa intendi. Quindi, quando un albero concreto dovrebbe essere usato e considerato più appropriato di un albero astratto, e un albero concreto si preoccupa della precedenza? – Luke