View Single Post
Old 27-02-2002, 16:56   #7
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Guarda...non è così semplice...anzi...

In pratica quello che vuoi fare si chiama "parsing"...

Ovvero si tratta di riconoscere vari "comandi" e i loro parametri...
Ogni comando ha un suo formato ben preciso...

Ti faccio un esempio...
Leggi un carattere alla volta fino a quando non ottieni in lettura un carattere diverso da una lettera...un ciclo del genere...

char leggiParola(char *parola, int len, FILE * f)
{
int n = 0;
//elimino spazi, tab, ritorno carrello precedenti
do parola[0] = fgetc(f); while(isspace(parola[0]));
while(isalpha(parola[n]) && n < len-1)
{
n++;
parola[n] = fgetc(f);
}
fseek(f, -1, SEEK_CUR); //torno indietro per poter rileggere dopo il prox carattere
char tmp = parola[n+1];
parola[n+1] = '\0'; //carattere di fine stringa...
return tmp;
}

char leggiNumero(char *parola, int len, FILE * f)
{
int n = 0;
//elimino spazi, tab, ritorno carrello precedenti
do parola[0] = fgetc(f); while(isspace(parola[0]));
while(isnumber(parola[n]) && n < len-1)
{
n++;
parola[n] = fgetc(f);
}
fseek(f, -1, SEEK_CUR); //torno indietro per poter rileggere dopo il prox carattere
char tmp = parola[n+1];
parola[n+1] = '\0'; //carattere di fine stringa...
return tmp;
}
.....
.....
....
//comincio leggendo la prima parola
char buffer[1024];
leggiParola(buffer, 1024, f);
//Ora bisogna riconoscere quale comando è stato letto
//Ti faccio un esempio per il comando CELLS
if(!strcmp(parola,"CELLS"))
{
//Abbiamo riconosciuto il comando CELLS
leggiParola(buffer, 2, f);

//buffer[0] ora deve contenere una grafa aperta
if(buffer[0]!='{')
errore(); //Il programma deve terminare all'interno di questa funzione

//a questo punto abbiamo una grafa aperta e ora ci vuole un numero
leggiNumber(buffer, 1024, f);
//Ora dobbiamo aver letto un numero
if(!isnumber(buffer)) errore();
//questa stringa va convertita in un numero con le funzioni atoi o atof
....
}

Insomma tuto funziona così con una bella serie di if...poi è solo un esempi...per rendere più snella la scrittura del codice puoi passare alla funzione leggiParola la parola che vuoi che compaia in modo da far generare l'errore da quella funzione...

Te l'ho detto...non è banale...io in questo modo ci ho scritto un semplice cmpilatore C++...
cionci è offline   Rispondi citando il messaggio o parte di esso