Бьерн Страуструп.
Язык программирования С++
75
возвращается лексема PRINT, и она же помещается в curr_tok.
Числа обрабатываются следующим образом:
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '.':
cin.putback(ch);
cin >> number_value;
return
curr_tok=NUMBER;
Размещать метки вариантов горизонтально, а не вертикально,- не самый лучший способ, поскольку
такой текст труднее читать; но писать строку для каждой цифры утомительно. Поскольку оператор >>
может читать константу с
плавающей точкой типа double, программа тривиальна: прежде всего
начальный символ (цифра или точка) возвращается назад в cin, а затем константу можно считать в
number_value. Имя, т.е. лексема NAME, определяется как буква, за которой может идти несколько букв
или цифр:
if (isalpha(ch)) {
char* p = name_string;
*p++ = ch;
while (cin.get(ch) && isalnum(ch)) *p++ = ch;
cin.putback(ch);
*p = 0;
return
curr_tok=NAME;
}
Этот фрагмент программы заносит в name_string строку, оканчивающуюся нулевым символом. Функции
isalpha() и isalnum() определены в
. Результат isalnum(c) ненулевой, если c - буква или цифра,
и нулевой в противном случае.
Приведем, наконец, функцию ввода полностью:
token_value get_token()
{
char
ch;
do { // пропускает обобщенные пробелы за исключением '\n'
if(!cin.get(ch)) return curr_tok = END;
} while (ch!='\n' && isspace(ch));
switch (ch) {
case
';':
case
'\n':
cin
>>
ws;
// пропуск обобщенного пробела
return
curr_tok=PRINT;
case
'*':
case
'/':
case
'+':
case
'-':
case
'(':
case
')':
case
'=':
return
curr_tok=token_value(ch);
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
Бьерн Страуструп.
Язык программирования С++
76
case
'.':
cin.putback(ch);
cin
>>
number_value;
return
curr_tok=NUMBER;
default:
//
NAME,
NAME=
или ошибка
if
(isalpha(ch))
{
char*
p
=
name_string;
*p++
=
ch;
while (cin.get(ch) && isalnum(ch)) *p++ = ch;
cin.putback(ch);
*p
=
0;
return
curr_tok=NAME;
}
error("недопустимая лексема");
return
curr_tok=PRINT;
}
}
Преобразование операции в
значение лексемы для нее тривиально, поскольку в перечислении
token_value лексема операции была определена как целое (код символа операции).
Достарыңызбен бөлісу: