Programmazione orientata agli oggetti in ANSI-C. Programmazione Savvy. Espressioni aritmetiche

Il dynamic Linkage è di per sè una tecnica di programmazione veramente potente. Piuttosto che scrivere poche funzioni, ognuna con una lunga sequenza di istruzioni nel costrutto switch - cosa che sicuramente permette di gestire una varia casistica - potremmo scrivere molte piccole funzioni, una per ogni caso ed utilizzare la funzione più adatta tramite il dynamic linkage.

Ciò spesso semplifica il lavoro di routine e permette di disporre così di un codice che può essere esteso facilmente.

Ad esempio, pensiamo di scrivere un piccolo programma per leggere e valutare le espressioni matematiche contenenti numeri floating point, parentesi e i tradizionali operatori per le addizioni, le sottrazioni e così via. Normalmente, useremmo un tool di compilazione come lex e yacc per costruire quella parte del programma che riconosce un'espressione aritmetica. Questo libro non si occupa della teoria dei compilatori, nè di come si implementano, ma avremo in questo capitolo l'occasione di dare una "sbirciata" al funzionamento base dei compilatori.

Il ciclo principale
Il ciclo principale (main loop) del programma legge una linea dallo standard input, inizializza le cose in modo che i numeri e gli operatori possano essere estratti e gli spazi bianchi ignorati, chiama la funzione per il riconoscimento di una corretta espressione aritmetica e lo memorizza da qualche parte, e infine analizza ciò che è stato precedentemente memorizzato. Se le cose vanno male, basterà leggere la nuova linea di input.

Ecco il main loop:

#include 
static enum tokens token; /* current input symbol */
static jmp_buf onError;
int main (void)
{ volatile int errors = 0;
char buf [BUFSIZ];
if (setjmp(onError))
++ errors;
while (gets(buf))
if (scan(buf))
{ void * e = sum();
if (token)
error("trash after sum");
process(e);
delete(e);
}
return errors > 0;
}

void error (const char * fmt, ...)
{ va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap), putc(’\n’, stderr);
va_end(ap);
longjmp(onError, 1);
}

Il punto di gestione dell'errore è definito con setjmp(). Se error() viene chiamata da qualche parte nel programma, longjmp() continua l'esecuzione con un altro return da setjmp(). In questo caso, il risultato è il valore passato a longjmp(), l'errore viene conteggiato e viene letta la nuova linea. Il codice di uscita del programma indica se si sono verificati errori.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend