Выполнение цикла do-while |
Обработка цикла do-while очень похожа на обработку цикла while. Когда функция interp () находит оператор do, она вызывает функцию exec_do (), код которой приведен далее. // Выполняет цикл do. void exec_do() { int cond; char *temp; // Сохраняет местоположение начала цикла do. putbackO; // возвращает во входной поток лексему do temp - prog; get_token(); // получает начало блока цикла // Подтверждает начало блока. get_token(); if(*token != '{') throw InterpExc(BRACE_EXPECTED); putback(); interp (); // интерпретирует цикл // Ищет оператор break в цикле, i f(breakfound) { prog — temp; // Находит начало блока в цикле, do { get_token(); } while(*token != '{' && tok != END); // Находит конец блока while, putback(); find_eob(); // Теперь находит конец выражения while, do { get_token(); } while(*token != ';' && tok != END); if(tok == END) throw InterpExc(SYNTAX); breakfound = false; return; } get_token(); if(tok != WHILE) throw InterpExc(WHILE_EXPECTED); eval_exp(cond); // проверяет условие цикла // Если true, повторяет цикл; в противном случае идет дальше, if(cond) prog = temp; } Главное отличие цикла do/while от цикла while состоит в том, что цикл do/while всегда выполняется хотя бы один раз, поскольку его условное выражение расположено в конце цикла. Следовательно, функция exec_do сначала сохраняет в переменной temp местоположение начала цикла и затем вызывает функцию interpo для интерпретации блока кода, входящего в цикл. Когда функция interpo завершает работу, получается соответствующая while-часть блока и вычисляется условное выражение. Если оно равно true, в указатель prog помещается адрес начала цикла. Если обнаружен оператор break, итерация цикла прекращается и находится конец блока цикла.
|