3.1 Основной цикл |
Предыдущая Содержание Следующая |
Основной цикл программы читает строку из стандартного потока ввода, инициализирует всё так, что числа и операторы могут быть извлечены, а пробелы проигнорованы, вызывает функцию для распознавания корректного арифметического выражения и как-то сохраняет его, и, наконец, обрабатывает всё, что было сохранено. Если что-то идёт не так, просто читаем следующую строку ввода. Вот основной цикл:
#include <setjmp.h>
static enum tokens token; /* текущий символ входного потока */
static jmp_buf onError;
int main (void) { volatile int errors = 0; char buf [BUFSIZ]; if (setjmp(onError)) ++ errors; while (gets(buf)) if (scan(buf)) { void * e = sum(); if (token) error("trash after sum"); process(e); delete(e); } return errors > 0; }
void error (const char * fmt, ...) { va_list ap;
va_start(ap, fmt); vfprintf(stderr, fmt, ap), putc(’\n’, stderr); va_end(ap); longjmp(onError, 1); }
Точка восстановления в случае ошибки определяется с помощью setjmp(). Если где-то в программе вызывается error(), longjmp() продолжает выполнение с другим значением, полученным от setjmp(). В этом случае результатом является значение, переданное в longjmp(), ошибка учитывается, и считывается следующая строка ввода. Код выхода программы информирует, были ли обнаружены какие-либо ошибки.
|
Предыдущая Содержание Следующая |