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.