Home
Accesso / Registrazione
 di 

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

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.

 

 

Scrivi un commento all'articolo esprimendo la tua opinione sul tema, chiedendo eventuali spiegazioni e/o approfondimenti e contribuendo allo sviluppo dell'argomento proposto. Verranno accettati solo commenti a tema con l'argomento dell'articolo stesso. Commenti NON a tema dovranno essere necessariamente inseriti nel Forum creando un "nuovo argomento di discussione". Per commentare devi accedere al Blog

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Ultimi Commenti