|
Программирование >> Формирование пользовательского контейнера
func type ft; Если brace равна О, текущая позиция, в коде находится за пределами любой функции, int brace = 0; р = prog; do { Обходит код тела функции while(brace) { get tolcen(); if(tolc == END) throw InterpExc (UNBAL BRACES); if (*tolcen == { ) brace++; if(*tolcen == }) brace-; tp = prog; сохраняет текущую позицию get token(); Проверяет, не тип ли глобальной переменной или возвращаемого значения функции. if(tok==CHAR II tok==INT) { datatype = tok; сохраняет тип данных get token(); if(token type == IDENTIFIER) { s trcpy (tertp, token); get token(); if(*token != () I должна быть глобальная переменная prog = tp; возвращается к началу объявления decllobal (); . } else if(*token == () { должна быть функция Проверяет, не определена ли уже функция, for(unsigned i=0; i < func table.size(); i++) if(!stronp(func table[i].func name, temp)) throw InterpExc(DUP FUNC); ft.loc = prog; ft.ret type = datatype; s trcpy (f t. ftinc naine, tenp); f vinc table. push back (ft); * do { get token(); } while(*token != )*); Теперь следующей лексемой будет открьшающая фигурная скобка тела функции. else putbackO ; else { if(*to ken == {) brace++; if(*token == }) brace--; } while(tok != END); if (brace) throw InterpExc (XJNBAL BRACES); prog = p; Интерпретирует отдельный оператор или блок кода. Функция interpO возвращается из первоначального вызова, если обнаружена конечная фигурная скобка (или return) в функции mainO . void interpO int value; int block = 0; do { He интерпретирует, пока не обработан break, if(breakfound) return; token type = get token (); Определяет, какая лексема представлена. if(token type == IDENTIFIER *token == INC II *token == DEC) He ключевое слово, поэтому обрабатьшает выражение. putbackO; возвращает лексему во входной поток для последующей обработки с помощью eval exp() eval e:ф (value); обрабатывает выражение if(*token != ;)Gthrow InterpExc(SEMI EXPECTED); else if (token type==BIiOCK) { ограничитель блока if(*token == ){ блок block =1; интерпретирует блок, a не оператор Записывает вложенную область видимости. nest scope stack.push(local var stack.size()); else { фигурная скобка }, поэтому восстанавливает область видимости и возвращается Восстанавливает вложенную область видимости. local var stack. resize (nest scope stack. top О ); nes t scope stack.pop(); return; else ключевое слово switch (tok) { case CHAR: case INT: объявляет локальные переменные putbackO ; decl local (); break; case RETURN: возвращается из вызванной функции func ret(); return; case IF: обрабатывает оператор if exec if(); break; case ELSE: обрабатывает оператор else find eob(); находит конец блока else и продолжает выполнение
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |