3.2 Сканер |
Предыдущая Содержание Следующая |
В основной цикле после того, как строка ввода была прочитана в buf[], она передаётся в scan(), которая для каждого вызова помещает следующий входной символ в переменную token. В конце строки token равен нулю:
#include <ctype.h> #include <errno.h> #include <stdlib.h>
#include "parse.h" /* определение NUMBER */
static double number; /* если NUMBER: численная величина */
static enum tokens scan (const char * buf) /* возвращает token = следующий символ ввода */ { static const char * bp; if (buf) bp = buf; /* новая строка ввода */
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; }
scan() вызывается с адресом строки ввода или с нулевым указателем для продолжения работы с текущей строкой. Пробелы игнорируются, и получив первой цифру или десятичную точку, мы извлекаем число с плавающей запятой с помощью функцией ANSI-C strtod(). Любой другой символ возвращается как есть и мы не двигаемся далее нулевого байта в конце входного буфера. Результат scan() сохраняется в глобальной переменной token — это упрощает распознаватель. Если обнаружено число, возвращается уникальное числовое значение NUMBER, а фактическое значение делается доступным в глобальной переменной number.
|
Предыдущая Содержание Следующая |