5.1 Сканирование идентификаторов

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

В разделе 3.2 мы написали функцию scan(), которая принимает строку ввода из основной программы и выдаёт по одному символу из строки ввода на вызов. Если мы хотим добавить ключевые слова, именованные константы и так далее, надо расширить scan(). Мы извлекаем алфавитно-цифровые строки для дальнейшего анализа так же, как и числа с плавающей точкой:

 

#define ALNUM    "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \

                 "abcdefghijklmnopqrstuvwxyz" \

                 "_" "0123456789"

 

static enum tokens scan (const char * buf) {

    static const char * bp;

    ...

    if (isdigit(* bp) || * bp == ’.’)

        ...

    else if (isalpha(* bp) || * bp == ’_’) {

        char buf [BUFSIZ];

        int len = strspn(bp, ALNUM);

        if (len >= BUFSIZ)

            error("name too long: %-.10s...", bp);

        strncpy(buf, bp, len), buf[len] = ’\0’, bp += len;

        token = screen(buf);

    }

    ...

 

После того, как идентификатор получен, мы позволяем новой функции screen() решить, каким должно быть значение token. При необходимости screen() будет помещать описание символа в глобальной переменной symbol, которую сможет проверять анализатор.

 

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