|
Программирование >> Формирование пользовательского контейнера
if (!scrcnp(global vars [i] .var naine, vname)) { if(global vars[i].v type == CHAR) global vars[i].value = (char) value; else if(global vars[i].v type == INT) global vars[i].value = value; retiim; throw InterpExc(NOT VAR); переменная не найдена Находит значение переменной. int finci var(char * vname) Сначала проверяет, не локальная ли переменная, if(!local var stack.empty()) for(int i=local var s tack.s ize()-1; i >= £imc call stack.top(); i-) i f (! s trcmp (local var s tack [ i ]. var name, vname)) retiim local var stack[i] .value; В противном случае проверяет глобальные переменные. for(imsigned i=0; i < global vars.size(); i++) if (! strcmp(global vars [i]. var name, vname)) retiim global vars [ i ] . value; throw InterpExc(NOT VAR); переменная не найдена Выполняет оператор if. void exec ifО int cond; eval exp(cond); получает вьражение оператора if. if(cond) ( если true, обрабатывает блок в составе IF eval exp(sval); Получает вьражение switch. Проверяет начало блока. if(*token != {) Подтверждает начало блока. if(*token != {) throw InterpExc(BRACE EXPECTED); interpO ; else { В противном случае пропускает блок IF и обрабатывает ELSE, если он есть. finci eob(); находит начало следующей строки get token() ; if(tok != ELSE) ( Возвращает лексему, если нет ELSE. putbackO ; retum; Подтверждает начало блока. get token(); if(*token !={) throw InterpExc(BRACE EXPECTED); putbackO ; interpO ; Выполняет оператор switch. void exec switch() int sval, cval; int brace; throw InterpExc(BRACE EXPECTED); Записывает новую область видимости. nest scope stack.push(local var stack.size()); Теперь проверяет варианты case. for(;;) { brace = 1; Находит вариант case, do { get token() ; if(*token == {) brace++; else if(*token == }) brace--; } while(tok != CASE && tok != END && brace); Если соответствующего варианта case не найдено, то пропускает, i f(!brace) break; if (tok == END) throw InterpExc (SYNTAX) ; Получает значение варианта case. eval e (cval); Читает и отбрасывает get token(); if(*token != :) throw InterpExc(COLON EXPECTED); Если значения совпадают, то интерпретирует, if(cval == sval) { brace = 1; do { interpO ; if(*token == {) brace++; else if(*token == }) brace--; } while(!breakfound && tok != END && brace);
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |