|
Esaminiamo le fasi in cui si divide il processo della
compilazione.
1. Per prima cosa il sorgente, considerato come un semplice
flusso di caratteri, viene suddiviso in un flusso di
“pezzi” significativi detti token, ottenuti
raggruppando sequenze di caratteri. Questa fase viene detta
analisi lessicale, e si utilizza il Lex per generare
automaticamente un modulo che la gestisce.
2.La sequenza dei token viene analizzata grammaticalmente per
ricostruire la derivazione del programma dalla grammatica.
Ricostruire le regole grammaticali da cui ogni struttura
sintattica è derivata equivale a costruire (implicitamente)
il cosiddetto albero di sintassi concreta. Questa fase è
svolta da un parser generato automaticamente da Yacc data la
grammatica.
3.Via via che le regole grammaticali (o parti di esse) vengono
riconosciute, viene invocato, contestualmente ad ogni regola
grammaticale, un blocco di codice in linguaggio C, detto azione
semantica. Questo codice viene incorporato nel sorgente Yacc
insieme alla grammatica, in modo da poter essere compilato
insieme al resto del parser generato automaticamente. Le azioni
semantiche solitamente vengono utilizzate per costruire l'albero
di sintassi astratta.
4.Una volta che è stato generato l'albero di sintassi
astratta, si effettuano le fasi più “semantiche”
che agiscono su questa rappresentazione; un albero di sintassi
astratta è relativamente facile da manipolare
algoritmicamente.
Nel nostro esempio non genereremo né l'albero di sintassi
astratta né tantomeno quello di sintassi concreta. Invece,
ogni volta che verrà riconosciuta una regola grammaticale
del sorgente in BASIC provvederemo a generare direttamente il
codice C corrispondente. Questo è fattibile perché il
nostro compito consiste sostanzialmente in una traduzione passo
passo: una volta riconosciuta una struttura sintattica nel
linguaggio sorgente possiamo provvedere immediatamente alla
generazione della struttura sintattica risultante nel linguaggio
target. Questo non è possibile in molti casi reali: in
generale è necessario costruire esplicitamente l'albero di
sintassi astratta e provvedere a rielaborazioni e
ottimizzazioni.
|