5.1 Сканирование идентификаторов |
Предыдущая Содержание Следующая |
В разделе 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, которую сможет проверять анализатор.
|
Предыдущая Содержание Следующая |