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


<<< Azioni semantiche di traduzione >>>

Tutto è pronto per chiudere il cerchio. In corrispondenza di ogni regola grammaticale scriviamo una azione semantica che genera il codice C corrispondente ad ogni costrutto BASIC. L'intero traduttore è l'implementazione di una funzione di traduzione B2C, definita ricorsivamente sulla grammatica del BASIC. Non scriviamo l'intera funzione, mostriamo solo qualche caso interessante per dare una idea del processo:

B2C[ INTEGER ] = INTEGER
B2C[ VARIABLE ] = 
"var[" <iniziale-di-VARIABLE> "-'A']"

Un intero in BASIC è identico ad un intero in C. Ad ogni variabile in BASIC invece faremo corrispondere un elemento dell'array var indicizzato dall'iniziale della variabile; così la variabile TEMP sarà tradotta come var['T'- 'A'] (non dimentichiamo che abbiamo scelto di considerare significativo soltanto il primo carattere di una variabile).

B2C[<exp1> + <exp2>] = 
B2C[<exp1>] "+" B2C[<exp2>] 
B2C[<exp1> <> <exp2>] = 
B2C[<exp1>] "!=" B2C[<exp2>]
L'operatore di somma è identico in C e in BASIC, mentre l'operatore di diverso è "<>" in BASIC e "!=" in C.
B2C[ FOR <var> '=' <exp1> TO <exp2> 
<stat-list> NEXT] =
"for(" B2C[<var>] "=" B2C[<exp1>] ";" 
B2C[<var>] "<=" B2C[<exp2>] ";"
"++" B2C[<var>] ") 
{" B2C[<stat-list>] "}"

Un ciclo come FOR I=1 TO 10 diventa quindi for(i=1; i<=10; ++i). Avendo ormai il riconoscitore di tutte le regole grammaticali del BASIC, non resta che implementare per ogni regola la funzione di traduzione da BASIC a C di cui avete visto qualche esempio. L'implementazione nella grammatica altro non fa che stampare con una printf le equivalenze tra la struttura grammaticale BASIC riconosciuta e il codice C equivalente. Nel prossimo listato è visibile un esempio di un programma di test in BASIC e il programma in C risultante dall'applicazione di b2c. Il risultato non è particolarmente leggibile, soprattutto per la mancanza di indentazione, ma il programma in C, una volta compilato, è perfettamente funzionante.

INPUT:
print "Test b2c"
print "Un numero: ";
input n
s=0
for i = 1 to n
print i ;
print " ";
s = s + i
next
print
print "La somma da 1 a ";
print n ;
print " e' ";
print s
if s>20 then print "La somma e' maggiore di 20"
else print "La somma e' minore di 20"
endif

OUTPUT:

#include <stdio.h>
int main(void) {
int var[26];
printf("Test b2c" "\n");
printf("Un numero: ");
scanf("%d", &var['N'-'A']);
var['S'-'A'] = 0;
for(var['I'-'A'] = 1; var['I'-'A'] <= var['N'-'A'];
++var['I'-'A']) {
printf("%d", var['I'-'A']);
printf(" ");
var['S'-'A'] = var['S'-'A'] + var['I'-'A'];
}
printf("\n");
printf("La somma da 1 a ");
printf("%d", var['N'-'A']);
printf(" e' ");
printf("%d\n", var['S'-'A']);
if(var['S'-'A'] > 20) {
printf("La somma e' maggiore di 20" "\n");
} else {
printf("La somma e' minore di 20" "\n");
}
return(0);
}
ePrometeus s.r.l. - Web Software House & Open Source System Integrator
MILANO - SAN BENEDETTO DEL TRONTO(AP)
Contatti: info@eprometeus.com