Программирование >>  Формирование пользовательского контейнера 

1 ... 142 143 144 [ 145 ] 146 147 148 ... 156


) while(*token != { && tok != END);

putbackO ; breakfound = false;

find eob(); теперь ищет конец цикла return;

Функция exec while() выполняется следующим образом. Сначала лексема while возвращается во входной поток, и местоположение в профамме цикла while сохраняется в указателе temp. Этот адрес позволяет интерпретатору возвращаться к началу цикла при его повторении. Далее повторно читается лексема while для удаления ее из входного потока, и вызывается функция evai exp(), которая вычисляет значение условного выражения цикла while. Если оно истинно, вызывается функция interpO лля интерпретации кода блока while. Когда функция interp о возвращается в вызывающую процедуру, в указатель профаммы prog зафужается адрес начала цикла while, что приводит к возобновлению выполнения профаммы с точки начала цикла, когда управление вновь передается функции interp (). В результате выполняется следующая итерация цикла. Однако если функция interp () возвращается, потому что внуфи цикла всфетился оператор break, итерация прерывается, определяется конец блока while и заверщается функция exec whiie(). Если условное выраженис цикла равно false, го находится конец блока while, и функция заканчивает работу.

Выполнение цикла do-while

Обработка цикла do-while очень похожа на обработку цикла while. Когда

функция interp () находит оператор do, она вызывает функцию exec do (),

код которой приведен далее.

Выполняет цикл do.

void exec do()

int cond; char *teitp;

Сохраняет местоположение начала цикла do. putbackO; возвращает во входной поток лексему do tenp = prog;

get token(); получает начало блока цикла



Подтверждает начало блока.

get token();

if(*token != { )

throw InterpExc(BRACE EXPECTED); putback();

interp (); интерпретирует цикл

Ищет оператор break в цикле, if(breakfound) { prog = tenp;

Находит начало блока в цикле, do {

get token(); } while(*token != { && tok != END);

Находит конец блока while.

putbackO;

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 eзф(cond); проверяет условие цикла

Если true, повторяет цикл; в противном случае идет дальше, if(cond) prog = tenp;



Главное отличие цикла do/while от цикла while состоит в том, что цикл do/while всегда выполняется хотя бы один раз, поскольку его условное выражение расположено в конце цикла. Следовательно, функция exec do сначала сохраняет в переменной temp местоположение начала цикла и затем вызывает функцию interpO для интерпрстации блока кода, входящего в цикл. Когда функция interp о завершает работу, получается соответствующая while-часть блока и вычисляется условное выражение. Если оно равно true, в указатель prog помещается адрес начала цикла. Если обнаружен оператор break, итерация цикла прекращается и находится конец блока цикла.

Цикл for

Интерпретация цикла for представляет собой более сложную задачу по сравнению с обработкой других циклов. Отчасти это связано с тем, что структура цикла for в языке С++ разрабатывалась в расчете на компиляцию. Главное неудобство состоит в том, что условное выражение должно проверяться в начале цикла, а наращивание управляющей переменной цикла выполняется в конце цикла. Следовательно, несмотря на то, что эти два компонента цикла for следуют один за другим в исходном коде, их интерпретация разделена повторно выполняемым блоком кода (телом цикла). Немного усилий и цикл for все-таки можно корректно интерпретировать.

Когда функция interp о обнаруживает оператор for, она вызывает функцию exec f or (), КОД которой Приведен далее. Выполняет цикл for. void exec for() {

int cond;

char *teinp, *tenp2; int paren ;

get token(); пропускает открывагацую скобку ( eval eзф(cond); выражение инициализации

if(*token != ;) throw InterpExc(SEMI EXPECTED); prog++; переходит за ; в исходном коде tenp = prog;

for(;;) {

Получает значение условного выражения. eval exp(cond);

if(*token != ;*) throw InterpExc(SEMI EXPECTED);



1 ... 142 143 144 [ 145 ] 146 147 148 ... 156

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика