|
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);
}
|