Programmazione orientata agli oggetti in ANSI-C. Lo Scanner

Nel ciclo principale, una volta che una linea di input è stata letta in bug[], viene passata a scan(), che per ogni chiamata inserisce il successivo simbolo di input all'interno della variabile token. Alla fine di una linea token è zero:

#include <ctype.h>
#include <errno.h>
#include <stdlib.h>
#include "parse.h" /* defines NUMBER */
static double number; /* if NUMBER: numerical value */
static enum tokens scan (const char * buf)
/* return token = next input symbol */
{ static const char * bp;
if (buf)
bp = buf; /* new input line */
while (isspace(* bp))
++ bp;
if (isdigit(* bp) || * bp == ’.’)
{ errno = 0;
token = NUMBER, number = strtod(bp, (char **) & bp);
if (errno == ERANGE)
error("bad value: %s", strerror(errno));
}
else
token = * bp ? * bp ++ : 0;
return token;
}

Chiamiamo scan() con l'indirizzo di una linea di input o con un puntatore null per continuare a lavorare sulla linea corrente. Gli spazi bianchi sono ignorati e per una cifra o per un punto decimale estraiamo un numero floating point con la funzione C ANSI strod(). Ogni altro carattere viene restituito così come è.

Il risultato di scan() viene memorizzato nella variabile globale token - ciò semplifica il riconoscimento. Se identifichiamo un numero, restituiremo il valore univoco NUMBER e il valore corrente di tale numero viene memorizzato nella variabile globale number.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend