Программирование. Принципы и практика использования C++ Исправленное издание, стр. 85
return left; } }}
%%%%term()2/0double term(){ double left = primary(); Token t = get_token(); while(true) { switch (t.kind) { case '*': left *= primary(); t = get_token(); break; case '/': { double d = primary(); if (d == 0) error("деление на нуль"); left /= d; t = get_token(); break; } default: return left; } }
}Почему мы поместили обработку операции
/switch6.5.4. Первичные выражения
Грамматическое правило для первичных выражений также простое.
Первичное выражение: Число '('Выражение')'Программный код, реализующий это правило, немного сложен, поэтому он открывает больше возможностей для синтаксических ошибок.
double primary(){ Token t = get_token(); switch (t.kind) { case '(': // обработка варианта '('выражение')' { double d = expression(); t = get_token(); if (t.kind != ')') error("')' expected"); return d; } case '8': // используем '8' для представления числа return t.value; // возвращаем значение числа default: error("ожидается первичное выражение"); }}По сравнению с функциями
expression()term()Token6.6. Испытание первой версии
Для того чтобы выполнить эти функции калькулятора, необходимо реализовать функции
get_token()main()main()expression()int main()try { while (cin) cout << expression() << '\n'; keep_window_open();}catch (exception& e) { cerr << e.what() << endl; keep_window_open (); return 1;}catch (...) { cerr << "exception \n"; keep_window_open (); return 2;}Обработка ошибок представляет собой обычный шаблон (см. раздел 5.6.3). Отложим реализацию функции
get_token()ПОПРОБУЙТЕ
Первая версия программы, имитирующей работу калькулятора (включая функцию
get_token()calculator00.cppНет ничего удивительного в том, что эта первая версия калькулятора работает не совсем так, как мы ожидали. Мы пожимаем плечами и спрашиваем себя: “Почему?”, или “Почему программа работает так, а не иначе?”, или “Что же она делает?” Введите число
2342