Интерпретатор
| Категория реферата: Рефераты по информатике, программированию
| Теги реферата: греция реферат, шпаргалки скачать
| Добавил(а) на сайт: Мокасеев.
Предыдущая страница реферата | 1 2 3 4 5 6 | Следующая страница реферата
Функция cin.get(ch) читает один символ из стандартного входного потока в ch. Значение условия if(!cin.get(ch)) - ложь, если из потока cin нельзя получить ни одного символа. Тогда возвращается лексема END, чтобы закончить работу калькулятора. Операция ! (NOT) нужна потому, что в случае успешного считывания get() возвращает ненулевое значение.
Функция-подстановка isspace() из проверяет, не является ли ее параметр обобщенным пробелом. Она возвращает ненулевое значение, если является, и нуль в противном случае. Проверка реализуется как обращение к таблице, поэтому для скорости лучше вызывать isspace(), чем проверять самому. То же можно сказать о функциях isalpha(), isdigit() и isalnum(), которые используются в get_token().
После пропуска обобщенных пробелов следующий считанный символ определяет, какой будет начинающаяся с него лексема. Прежде, чем привести всю функцию, рассмотрим некоторые случаи отдельно. Лексемы 'n' и ';', завершающие выражение, обрабатываются следующим образом:
switch (ch) { case ';': case 'n': cin >> ws; // пропуск обобщенного пробела return curr_tok=PRINT;
Необязательно снова пропускать пробел, но, сделав это, мы избежим
повторных вызовов функции get_token(). Переменная ws, описанная в файле
, используется только как приемник ненужных пробелов.
Ошибка во входных данных, а также конец ввода не будут обнаружены до следующего вызова функции get_token(). Обратите внимание, как несколько
меток выбора помечают одну последовательность операторов, заданную для
этих вариантов. Для обоих символов ('n' и ';') возвращается лексема
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': 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;
}
Рекомендуем скачать другие рефераты по теме: доклад на тему, механизм реферат.
Категории:
Предыдущая страница реферата | 1 2 3 4 5 6 | Следующая страница реферата