ePrometeusCorsoLinuxLinux
testi articoli
Testi Articoli  Download
Home | OpenSource | PhpNuke | Programming | SysAdm | 
CorsoJava è ora Video! Free for all!
Clicca Qui!
UN COMPILATORE CON LEX E YACC
Usare Lex e Yacc per un traduttore da BASIC a C
Grammatiche ed alberi di sintassi concreta e astratta
Lex e Yacc
Un traduttore elementare da BASIC a C
Il processo della compilazione
Analisi lessicale con Lex
Analisi sintattica con Yacc
Azioni semantiche di traduzione
Conclusioni
Riferimenti
Download
L'Autore


<<< Il processo della compilazione >>>

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.

ePrometeus s.r.l. - Web Software House & Open Source System Integrator
MILANO - SAN BENEDETTO DEL TRONTO(AP)
Contatti: info@eprometeus.com