C++   ::   Хилл Мюррей

Страница: 98 из 357

Чтобы преодолеть это, надо проверять пропуски(пробел, символы тбуляции и т.п.):

char ch

do (* // пропускает пропуски за исключением '\n' if(!cin.get(ch)) return curr_tok = END; *) while (ch!='\n' amp; amp; isspace(ch));

Вызов cin.get(ch) считывает один символ из стандартного потока ввода в ch. Проверка if(!cin.get(ch)) не проходит в случае, если из cin нельзя считать ни одного символа. В этом случае возвращается END, чтобы завершить сеанс работы кальклятора. Используется операция ! (НЕ), поскольку get() возврщает в случае успеха ненулевое значение.

Функция (inline) isspace() из «ctype.h» обеспечивает стандартную проверку на то, является ли символ пропуском (#8.4.1); isspace(c) возвращает ненулевое значение, если c является символом пропуска, и ноль в противном случае. Прверка реализуется в виде поиска в таблице, поэтому использвание isspace() намного быстрее, чем проверка на отдельные символы пропуска; это же относится и к функциям isalpha(), isdigit() и isalnum(), которые используются в get_token().

После того, как пустое место пропущено, следующий символ используется для определения того, какого вида какого вида лексема приходит. Давайте сначала рассмотрим некоторые случаи отдельно, прежде чем приводить всю функцию. Ограничители лесем '\n' и ';' обрабатываются так:

switch (ch) (* case ';': case '\n': cin »» WS; // пропустить пропуск return curr_tok=PRINT;

Пропуск пустого места делать необязательно, но он позвляет избежать повторных обращений к get_token(). WS – это стандартный пропусковый объект, описанный в «stream.h»; он используется только для сброса пропуска.

|< Пред. 96 97 98 99 100 След. >|

Java книги

Контакты: [email protected]