Программирование. Принципы и практика использования C++ Исправленное издание, стр. 97
7.6.1. Символические константы
Оглядываясь назад, вспомним, что с помощью символа
'8'Tokencase '8': // символ '8' обозначает число return t.value; // возвращаем числоcase '–': return – primary();
'0''8'Token'8'const char number = '8'; // t.kind==number означает, что t — числоМодификатор
constnumber='0''8'Фрагмент кода функции
primary()case number: return t.value; // возвращает числоcase '–': return – primary();
Token_stream::get()case '.':case '0': case '1': case '2': case '3': case '4':case '5': case '6': case '7': case '8': case '9': { cin.putback(ch); // вернуть цифру в поток ввода double val; cin >> val; // считать число с плавающей точкой return Token(number,val); }Можно было бы придумать символические имена для всех лексем, но это излишне. Помимо всего прочего, символы
'(''+'';''q''p''e'const char quit = 'q'; // t.kind==quit значит, что лексема t — // код выходаconst char print = ';'; // t.kind==print значит, что лексема t — // код печатиТеперь цикл в функции
main()while (cin) { cout << "> "; Token t = ts.get(); while (t.kind == print) t=ts.get(); if (t.kind == quit) { keep_window_open(); return 0; } ts.putback(t); cout << "= " << expression() << endl;}Введя символические имена для инструкции “печать” и “выход”, мы сделали код понятнее. Кроме того, теперь тот, кто будет читать текст функции
main()'e'main()> = main()const string prompt = "> ";const string result = "= "; // используется для указания на то, что // далее следует результатЕсли нам в дальнейшем понадобится изменить приглашение или индикатор результата, будет достаточно просто изменить эти константы. Теперь цикл выглядит иначе.
while (cin) { cout << prompt; Token t = ts.get(); while (t.kind ==print) t=ts.get(); if (t.kind == quit) {