КАТЕГОРИИ: Архитектура-(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) |
Лекция 11
Команды SPL
Программа, реализующая интерпретатор, должна осуществить перевод текста программы на языке SPL в последовательность некоторых команд, занесенных в таблицу команд TCD. Затем эта последовательность команд выполняется. Какие это промежуточные команды и сколько их - это решает программист. В рассматриваемом интерпретаторе используется 10 команд. Каждая из них представлена целым положительным числом. Для удобства все они описаны в виде перечня целых констант. Это позволяет промежуточную команду в программе-интерпретаторе описать в виде сокращенного слова на английском языке. При этом каждому такому сокращению соответствует целое число. Итак, имеется глобальное описание перечисленных констант. enum{OPR,LIT,LDE,LDI,STE,STI,CAL,INI,JMC, JMP}; Напомним, что по умолчанию OPR соответствует целое число ноль. Соответственно LIT -единица, LDE - два и т. д.
В команде с кодом OPR есть десять операций. 1) OPR 1 -ввести в вершину стека число из файла stdin (с клавиатуры). OPR 2 - число из вершины стека выводится на экран дисплея (в файл stdout). OPR 3, OPR 4, OPR 5, OPR 6, OPR 7 - выполняют соответственно операции +, -,*, /, % над двумя верхними числами в стеке. При этом первый операнд находится в t-1, а второй - в вершине стека t. Результат всегда будет в вершине стека. OPR 8 - изменение знака на противоположный у числа в вершине стека. OPR 9 - возвращение из функции (return). Возвращается число, находящееся в вершине стека. При возвращении из main(), если счетчик команд p=-1, печатается результат. О счетчике команд р более подробно будет рассказано позже. OPR 10 – остановка. 2) LIT а - загрузка константы а в вершину стека t. 3) LDE а - загрузка значения глобальной переменной в вершину стека. а - смещение этой переменной в стеке. 4) LDI а - загрузка значения локальной переменной со смещением а в вершину стека. 5) STE а - число из вершины стека заносится в качестве глобальной переменной, имеющей смещение а. Иными словами, глобальной переменной, которая находится в st [a], присваивается значение из вершины стека. 6) STI а - число из вершины стека заносится в качестве локальной переменной, у которой сдвиг в стеке равен а. Осуществляется занесение из вершины стека в st[sp+a], где sp- адрес в стеке, с которого заносятся локальные переменные. 7) CAL а - вызов функции с точкой входа а в таблице команд TCD. 8) INI а – увеличение адреса вершины стека на а (выделение памяти). 9) JMC а - безусловный переход на команду с номером а в таблице команд TCD. 10) JMP а - условный переход на команду с номером а. Если число в вершине стека меньше или равно нулю, то переход осуществляется. Иначе- нет. Важно помнить, что после проверки условия содержание вершины стека пропадает.
Создание SPL –программы
Выше уже говорилось о том, что во время синтаксического анализа с помощью расширенных функций для нетерминальных символов заполняются таблицы ТОВ, TFN, TCD. Таблица идентификаторов TNM заполняется при лексическом анализе. При заполнении таблицы команд TCD выражения переводятся в обратный польский вид, когда а+b выглядит как < а><b>+. Константа или число со значением val переводится в команду {LIT val}. Локальная или глобальная переменная d со смещением в стеке а переводится соответственно в {LDE a} или в {LDI a}. Эти команды соответствуют вызову глобальной или локальной переменных, то есть занесение их значений в вершину стека t. Вызов функции f(e1,e2,…en)с точкой входа а в TCD переводится в последовательность команд <e1><e2>…<en> {LIT n } {CAL a}, где <ei> - результат перевода выражения ei. {LIT n } заносит в стек количество параметров. Изменение знака у выражения переводится в <e>{OPR 8}. Выполнение одной из арифметических операций для двух операндов e1 и e2 переводится в последовательность < e1>< e2>{OPR }, где =3,4,5,6,7 соответственно для +,-, *, /, %. То есть сначала в вершину стека заносится e1. Затем - e2. При этом e1 перемещается в t -1. Затем следует одна из операций над этими операндами {OPR }. Если в программе на языке SPL встречается присвоение глобальной переменной d значение e, где d имеет смещение в стеке, равное а, то оно будет заменено на последовательность <e>{STE a}. Присвоение для локальной переменной со смещением а выглядит как <e>{STI a}. Оператор ввода read d заменяется на {OPR 1}{STE a }для глобальной переменной d и на {OPR 1}{STI a} – для локальной. Здесь а- смещение в стеке. Операторы print e, return e переводятся соответственно в d <e>{OPR 2},<e>{OPR 9 }. То есть число e, находящееся в вершине стека t, выводится на экран или возвращается из функции. Оператор условной передачи управления if e then s end проверяет значение e в вершине стека. Если это число больше нуля, то выполняется последовательность s команд, находящаяся между then и end. Затем выполняется следующий за if оператор. Если е≤0, то управление сразу передается этому оператору. Это реализуется с помощью следующей последовательности команд в TCD <e>{JMC l} <s> l, где l- номер первой команды после последовательности команд s в TCD.
Оператор цикла while e do s end переводится в последовательность промежуточных команд lb:<e>{JMC l}<s>{JMP lb} l. Здесь lb - номер команды в TCD, по которой было получено результат е в вершине стека. l - номер команд в TCD, следующий за командой {JMP lb}. В начале проверяется число е в вершине стека. Если оно больше нуля, то выполняется последовательность s команд, стоящих между do и end. Затем выполняется безусловная передача управления команде с номером lb в TCD. Вновь проверяется е и т.д. Если е≤0, происходит переход на команду номер l в TCD (выход из цикла.) Рассмотрим, как выглядит описание функции. На языке SPL оно имеет вид f(параметры) begin описание локальных переменных и констант; операторы end Это описание переводится в последовательность команд a:{ INI m} <s> {OPR 10} Здесь a - точка входа в функцию (номер первой команды в TCD для этой функции); m - количество локальных переменных. s - последовательность команд, соответствующих операторам между begin и and. Пример. Имеется программа на языке SPL
main(x,y) begin int c; read c; c=x-y/c; if c then return c end
Рассмотрим, в какую последовательность промежуточных команд будет переведен этот текст. У функции main() имеются два параметра x и y и одна локальная переменная с. Смещение для параметров определяется в соответствии с ранее приведенным правилом через их количество n. Смещение для x равно –(n+2)=-4. Соответственно сдвиг для y равен -3. Для локальной переменной с сдвиг равен 1. Таким образом, переменные x,y, c находятся в стеке по адресам st[sp-4], st[sp-3], st[sp+1]. После перевода текста программы в таблице команд появится последовательность промежуточных команд, приведенных в таблице.
Напомним, что таблица TCD представляет собой массив структур cmd TCD [300]. В каждой структуре описана команда (что делать) и операнд (над чем производить операцию). Таким образом, содержимое TCD в виде кодов имеет следующий вид.
Таким образом, в таблице команд находится последовательность промежуточных команд, полученных в результате перевода программы с алгоритмического языка SPL.
Дата добавления: 2015-06-27; Просмотров: 531; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |