The website "dmilvdv.narod.ru." is not registered with uCoz.
If you are absolutely sure your website must be here,
please contact our Support Team.
If you were searching for something on the Internet and ended up here, try again:

About uCoz web-service

Community

Legal information

3.2 Сканер

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.

 

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