Драйвер
Когда все части программы на месте, нам нужен только драйвер для инициализации и всего того, что связано с запуском. В этом простом примере main() может работать так:
int main() { // вставить предопределенные имена: insert("pi")-value = 3.1415926535897932385; insert("e")-value = 2.7182818284590452354;
while (cin) { get_token(); if (curr_tok == END) break; if (curr_tok == PRINT) continue; cout
Принято обычно, что main() возвращает ноль при нормальном завершении программы и не ноль в противном случае, поэтому это прекрасно может сделать возвращение числа ошибок. В данном случае оказывается, что инициализация нужна только для введения предопределенных имен в таблицу имен.
Основная работа цикла - читать выражения и писать ответ. Это делает строка:
cout
Проверка cin на каждом проходе цикла обеспечивает завершение программы в случае, если с потоком ввода что-то не так, а проверка на END обеспечивает корректный выход из цикла, когда get_token() встречает конец файла. Оператор break осуществляет выход из ближайшего содержащего его оператора switch или цикла (то есть, оператора for, оператора while или оператора do). Проверка на PRINT (то есть, на '\n' или ';') освобождает expr() от обязанности обрабатывать пустые выражения. Оператор continue равносилен переходу к самому концу цикла, поэтому в данном случае
while (cin) { // ... if (curr_tok == PRINT) continue; cout
эквивалентно
while (cin) { // ... if (curr_tok == PRINT) goto end_of_loop; cout
Более подробно циклы описываются в #с.9.