Цикл while интерпретировать совсем легко. Эту задачу выполняет функция exec_while (), код которой приведен далее. // Выполняет цикл while. void exec_while() { int cond; char *temp; putbackO; // возвращает во входной поток лексему while temp = prog; // сохраняет начало цикла while get_token(); eval_exp(cond); // проверяет условное выражение // Подтверждает начало блока. if(*token != '{') throw InterpExc(BRACE_EXPECTED); if(cond) interpO; // если true, интерпретирует else { // в противном случае переходит к концу цикла find_eob(); return; } prog = temp; // возвращается к началу // Ищет оператор break в цикле, if(breakfound) { // Ищет начало блока в цикле. do { get_token (); } while(*token != '{' && tok != END); putback(); breakfound = false; find_eob(); // теперь ищет конец цикла return; } } Функция exec_while() выполняется следующим образом. Сначала лексема while возвращается во входной поток, и местоположение в программе цикла while сохраняется в указателе temp. Этот адрес позволяет интерпретатору возвращаться к началу цикла при его повторении. Далее повторно читается лексема while для удаления ее из входного потока, и вызывается функция evai_expo, которая вычисляет значение условного выражения цикла while. Если оно истинно, вызывается функция interp о для интерпретации кода блока while. Когда функция interp о возвращается в вызывающую процедуру, в указатель программы prog загружается адрес начала цикла while, что приводит к возобновлению выполнения программы с точки начала цикла, когда управление вновь передается функции interp (). В результате выполняется следующая итерация цикла. Однако если функция interp () возвращается, потому что внутри цикла встретился оператор break, итерация прерывается, определяется конец блока while и завершается функция exec_whiie(). Если условное выражение цикла равно false, то находится конец блока while, и функция заканчивает работу.
|