3.1 Основной цикл

Предыдущая  Содержание  Следующая V*D*V

Основной цикл программы читает строку из стандартного потока ввода, инициализирует всё так, что числа и операторы могут быть извлечены, а пробелы проигнорованы, вызывает функцию для распознавания корректного арифметического выражения и как-то сохраняет его, и, наконец, обрабатывает всё, что было сохранено. Если что-то идёт не так, просто читаем следующую строку ввода. Вот основной цикл:

 

#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(), ошибка учитывается, и считывается следующая строка ввода. Код выхода программы информирует, были ли обнаружены какие-либо ошибки.

 

Предыдущая  Содержание  Следующая