КАТЕГОРИИ: Архитектура-(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) |
Интерпретация. Программа, написанная на SPL в процессе работы программы - интерпретатора на Си преобразуется в последовательность неких промежуточных команд
Лекция 9 Программа, написанная на SPL в процессе работы программы - интерпретатора на Си преобразуется в последовательность неких промежуточных команд, список которых будет приведен ниже. Эти команды описаны в виде структуры.
typedef struct { int cod; int opd; } cmd; Структура команды содержит поле кода (int cod) и поле операнда (int opd). Код сообщает о том, что нужно делать, а операнд – над чем производится действие. Команды заносятся в таблицу команд, представляющую собой массив cmd TCD[300]; Кроме команд, имеется память для данных, которая моделируется стеком int st[500]. В самом начале стека в st[0], st[1], st[2] и т. д. размещаются глобальные переменные. Их количество определяется значением глобальной переменной int cgv = 0; Её значение инициализируется нулем и затем изменяется в процессе синтаксического анализа. После глобальных размещаются фактические переменные функции main(). За ними- количество фактических переменных. Затем следуют два адреса: адрес возврата (АВОЗ) и адрес активации (ААК). Для функции main() - это соответственно -2 и -1.После этого заносятся локальные переменные для функции main(). При вызове функцией main() другой функции в стеке, как и для main(), выделяется запись активации этого вызова. Теперь уже для вызываемой функции сначала заносятся фактические параметры р1, р2 , … рn, их количество- n, адрес возврата АВОЗ в таблице команд, адрес предыдущей записи активации в стеке (откуда состоялся вызов функции) ААК, локальные переменные для вызываемой функции. Количество вызовов из одной функции других функций ограничено величиной стека. В принципе оно не лимитируется. При описании структуры стека в компьютерной программе используются указатели: t- вершина стека (top);
sp - начало области локальных переменных функции (запись активации). Фактические параметры вызываемой функции размещаются ниже sp. Конкретное местонахождение каждого из них определяется как st[sp+k], где k - смещение(относительно sp). Для фактических параметров k<0 и оно определяется по формуле - (n+2), …, -4,-3. Здесь n – количество фактических параметров. В st[sp-2]- количество фактических параметров. В st[sp-1]- адрес возврата, а в st[sp] – ААК. Для локальных переменных смещение k>0.
Пример. Пусть вызывается функция a(x,y,z) begin int v,w end Смещение: для x- - (3+2)=-5 для y- =-4 для z- =-3 для v- =1 для w- =2
Таким образом, переменные x,y,z,v,w соответственно находятся в st[sp-5], st[sp-4], st[sp-3], st[sp+1], st[sp+2].
Таблицы интерпретатора
Ранее уже говорилось о таблице идентификаторов char TNM [400] и таблице команд cmd TCD [300]. При заполнении таблицы команд используется счетчик, представленный глобальной переменной int tc=0; Вначале tc =0. Затем его значение увеличивается при занесении очередной команды в таблицу команд TCD. Кроме упомянутых, имеются также таблица объектов и таблица функций. В таблице объектов находится информация об объектах - константах, глобальных и локальных переменных.
Объект представлен структурой. typedef struct { char * name; int what; int val; } odc; Первое поле содержит идентификатор объекта, под которым он записан в таблице идентификаторов TNM. int what может принимать значения: 1- объект является константой; 2- объект – глобальная переменная; 3- объект- локальная переменная; int val – это числовое значение для константы или же смещение k в стеке для переменных. Таблица объектов представлена глобальным массивом odc TOB [100]. Используется также глобальный указатель pto на первый свободный элемент в таблице объектов. При описании в него заносится адрес нулевого элемента таблицы TOB. odc *pto = TOB; Используется также указатель odc *ptol - начала описания локальных данных. В него при описании также заносится начальный адрес таблицы TOB.
odc *ptol = TOB; Еще при заполнении TOB используется глобальная переменная int out =1. Она используется в качестве признака для обрабатываемой переменной. Если out =1, то переменная глобальная, а если out =0, то локальная.
Таблица функций
Содержит сведения о функциях. Функция представлена структурой typedef struct { char*name int isd; int cpt; int start; } fnd;
Таблица функций представлена глобальным массивом fnd TFN[30]. Используется также глобальный указатель ptf на первый свободный элемент в этой таблице. При описании в него заносится адрес первого элемента. fnd *ptf=TFN. Первое поле- имя функции, под которым она описана в таблице идентификаторов TNM. Компонент TFN[i].isd указывает, описана функция или нет. Если описана, то TFN[i].isd=1, иначе - равна нулю. Компонент TFN[i].start содержит адрес точки входа в таблице команд для описанной функции или указатель цепочки вызовов для обратного заполнения- для описанной. TFN[i].cpt указывает количество параметров функции.
Дата добавления: 2015-06-27; Просмотров: 386; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |