КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Лекция 10. Для заполнения таблицы объектов, функций, команд и работы с ними используются специальные функции
Работа с таблицами
Для заполнения таблицы объектов, функций, команд и работы с ними используются специальные функции. Эти функции вызываются т.н. расширенными функциями, которые используются при синтаксическом анализе. Ранее уже говорилось о том, что для каждого нетерминального символа имеется функция для анализа выводимых из него цепочек. Результатом такого анализа является обнаружение синтаксических ошибок. Расширенные функции помимо указанного выше анализа еще дополнительно заполняют таблицы TOB, TFN и TCD, вызывая для этого специально предназначенные для этого функции. Ниже приведены эти функции. Функции для работы с таблицами объектов
/*newob -функция занесения в TOB нового объекта */ void newob(char*nm, int wt, int vl) { odc*p,*pe; pe=out? TOB: ptol; for(p=pto-1: p>=pe; p - -) if(strcmp(nm,p→name)= =0) { puts(“Функция описана дважды”); exit(1); } if(pto>= TOB+100) { puts(“Переполнение ТОВ”); exit(1); } p→name = nm; p→what=wt; p→val=vl; pto++; return; } Если out=1, это означает, что переменная глобальная, а если out=0, то локальная. В зависимости от этого поиск происходит по условию p>=TOB или p>=ptol. Напомним, что ptol - указатель начала описания локальных данных. В случае, если объект с заданным именем nm в ТОВ не имеется и ТОВ не переполнена, происходит занесение данных о новом объекте. После этого указатель pto на первый свободный элемент в ТОВ увеличивается на единицу. Если этого не сделать, то в ТОВ будет присутствовать только один объект, который заносится последним. /*функция findob() поиска элемента в TOB */ odc *findob(char*nm) { odc*p; for(p=pto-1: p>=TOB; p - -) if(strcmp(nm,p→name)= =0) return p; printf(“Объект %s не описан \n”, nm); exit(1); return p; } В случае, если объект не описан, предусмотрено сообщение об этом и прекращение работы программы. Еще один return p; написан только для того, чтобы не было сообщения об ошибке из-за несоответствия возвращаемого результата.
Функции для работы с таблицей функций
Функция занесения в TFN нового элемента fnd*newfn(char*nm, int df, int cp, int ps) { if(ptf>=TFN+30) { puts(“Переполнение TFN”); exit(1); } ptf→name = nm; ptf→isd=df; ptf→cpt=cp; ptf→start=ps; return ptf + +; } Напомним, что ptf указывает на первый свободный элемент в массиве fnd TFN[30]. Вначале осуществляется проверка, что TFN не переполнена. Если это так, то происходит занесение данных о новой функции и увеличение ptf на единицу.
Поиск функции в TFN fnd*findfn(char*nm) { fnd*p; for(p=ptf-1: p>=TFN; p - -) if(strcmp(nm,p→name)= =0) return p; return NULL; } Осуществляется поиск в TFN функции с заданным именем char*nm. Если такая функция будет найдена, то возвращается ее адрес, находящийся в указателе fnd*p. Иначе- возвращается ноль.
Вызов функции fnd*eval(char*nm, int cp) Цель. Вызвать findfn() и убедиться, что требуемая функция описана. Если она не описана, то вызвать функцию newfn(nm,0,cp,-1). Если описана, то проверить совпадение количества параметров. Если совпадает, то вернуть адрес, по которому функция находится в TFN. Иначе - сообщить об ошибке и прекратить выполнение программы.
fnd*eval(char*nm, int cp) { fnd*p; if(!p=findfn(nm)) return newfn(nm,0,cp,-1); if(p→cpt= =cp) return p; printf(“У функции %s не совпадает количество параметров \n”, nm); exit(1); return p; } После exit(1) еще один return p стоит только для того, чтобы компилятор не выдавал сообщение об ошибке из-за несоответствия типа возвращаемого результата.
Описание функции void defin(char*nm, int cp, int ad) { fnd*p; int c1,c2; p=findfn(nm); if(p) { if(p→isd) { printf(“Функция %s уже описана \n”,nm); exit(1); } if(p→cpt!=cp) { printf(“У функции %s не совпадает количество параметров \n”,nm); exit(1); } p→isd=1; for(c1=p→start;c1!=-1;c1=c2) { c2=TCD[c1].opd; TCD[c1].opd=ad; } p→start=ad; }// Для if(p) else newfn(nm,1,cp,ad); return; } Здесь nm, cp, ad соответственно имя описываемой функции, количество параметров и точка выхода для нее. Вначале осуществляется поиск функции по ее имени nm в TFN. В случае если такая функция есть, проверяется, не была ли она уже описана и совпадает ли количество параметров. Если функция еще не была описана и количество параметров совпадает, то присваивается p→isd=1. Это означает, что функция теперь уже описана. В этом месте следует вспомнить, что компонента TFN[i].start задает адрес точки входа для описания функции или же, если функция неописана,, указатель цепочки вызовов для обратного заполнения. На рисунке 3 показана ситуация, когда есть три вызова неописанной функции с именем SUM, имеющей n параметров.
Рисунок 3
В функции defin() обратное заполнение осуществляется в цикле for(). В самом начале в p→start находится адрес в TCD, откуда был последний вызов неописанной функции. По этому адресу находится команда g en(CAL, p→start). Он заносится в с1. До тех пор, пока с1≠-1 осуществляется последовательное обратное заполнение. В конце присваивается p→start=ad. В случае, если findfn(nm) не нашла в TFN функцию с именем nm, вызывается newfn(nm,1,cp,ad). То есть происходит занесение в TFN функции и сразу же ставится признак, что она описана.
Функция поиска функции main() и неописанных функций
fnd*fmain() { static сhar nm[]=”main”; fnd*pm=NULL; fnd*p; for(p=ptf-1;p>=TFN; p - -) { if(!p→isd) { printf(“Функция %s не описана \n”, p→name); exit(1); } if(strcmp(nm, p → name)= = 0) pm=p; }// закрыли цикл for() if(pm) return pm; puts(“Нет функции main”); exit(1); return pm; }
Второй раз r eturn pm; после exit(1) написано только для того, чтобы компилятор не указывал на ошибку. Если функция main() не будет найдена, то после сообщения об этом выполнится e xit(1); и до оператора return pm; выполнение программы не дойдет.
Дата добавления: 2015-06-27; Просмотров: 351; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |