3.2 Сканер

Предыдущая  Содержание  Следующая V*D*V

В основной цикле после того, как строка ввода была прочитана в 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.

 

Предыдущая  Содержание  Следующая