Студопедия

КАТЕГОРИИ:


Архитектура-(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; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.016 сек.