|
Программирование >> Формирование пользовательского контейнера
else { Сохраняет индекс стека локальных переменных. Ivarteirp = local var stack.size() ; get args(); получает аргументы функции temp = prog; сохраняет местоположение return fvinc call stack.push(lvartemp); заносит в стек индекс локальной переменной prog = loc; переустанавливает prog на начало функции get parains (); загружает параметры функции со значениями аргументов interpO; интерпретирует функцию prog = temp; переустанавливает программный указатель i f(func call s tack.empty()) throw InterpExc(RET NOCALL); Восстанавливает прежнее состояние local var stack. local var stack.resize(func call stack.top()); f 1Л1с са1 l s tack. pop (); Заносит аргументы функции в стек локальных переменных, void get args() { int value, count, temptNUlCPARAMS]; var type vt; count = 0; get token(); if{*token != () throw InterpExc(PAREN EXPECTED); Обрабатывает разделенный запятыми список значений, do { eval exp(value); 406 Г,ива9 tenp [covint] = value; сохраняет временно get token(); covint++; } while(*token ==,); count-; Теперь заносит в local var stack в обратном порядке. for(; count>=0; covint-) { vt.value = tenptcovint]; vt.V-type = ARG; locai var stack.pushj3ack(vt); Получает параметра функции. void get params() var type *p; int i; i = local var stack.size()-l; Обрабатьшает разделенный запятыми список параметров, do { get token(); р = &local var stack[i]; if(*token !=)){ if(tok != INT && tok != CHAR) throw InterpExc (TYPEL.EXPECTED) ; P->v type = tok; get token(); Связывает имя параметра с аргументом, который уже в стеке локальных переменных, strcpy(p->var name, token); get token(); , i--; if (!strcirp(local var stackti] .var name. vname)) if(local var stackIi].v type == CHAR) local var stackti].value = (char) value; else if(local var stackti].v type == INT) local var s tack t i].value = value; return; Б противном случае проверяет глобальные переменные, for(unsigned i=0; i < global vars.size(); i++) else break; } while(*token == ); if(*token != ) ) throw InterpExc(PAREN EXPECTED); Обработка возврата из функх. void fvinc ret() int value; value =0; Получает значение return, если есть. eval eзф(value); ret value = value; Присвги4вает значение переменной, void assign var (char *vnaine, int value) { Сначала проверяет, не локальная ли это переменная, if(!local var stack.empty()) forUnt i=local var stack.size()-1; i >= func call stack.top(); i~)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |