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

1 ... 130 131 132 [ 133 ] 134 135 136 ... 156


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~)



1 ... 130 131 132 [ 133 ] 134 135 136 ... 156

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