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

1 ... 128 129 130 [ 131 ] 132 133 134 ... 156


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 и продолжает выполнение



1 ... 128 129 130 [ 131 ] 132 133 134 ... 156

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