46023 (665330), страница 14

Файл №665330 46023 (Проектирование трансляторов) 14 страница46023 (665330) страница 142016-07-31СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 14)

после генерации тетрад , то с ним не связывается никакой

дополнительной семантики ZB: инструкция GOTO в Фортране ис-

пользует подпрограмму просмотра всей ST (LOOKUP) ,т.к. метки ин-

струкций не должны повторяться.

::=GOTO I

LOOKUP(I.NAME,P);

IF P=0 THEN

BEGIN INSERT(I.NAME,P);

P.TYPE:=LABEL;

P.DECLARED:=0;

END

ELSE CHECKTYPE(P,LABEL);

ENTER(BRL,P,0,0);

Подпрограмма CHECKTYPE(P,LABEL) сравнивает тип элемента ST,

на который указывает P с LABEL. В случае несовпадения печатается

сообщение об ошибке и ABORT.

3.Переменные и выражения

::=I|I()

::=выр|,

:=I -тетрад не генерирует

LOOKUP(I.NAME,P); поиск идентификатора

IF P=0 THEN ERROR(4);

.ENTRY:=P; связать с адрес найденного в ST элемента

В фортране если Р=0 нужно с помощью процедуры INSERT внести

идентифика тор в ST и установить TYPE равнымREAL или INT в зави-

симости от первой буквы идентификатора.

При обработке переменной с индексом I () необхо-

димо:

-сформировать тетрады для вычисления всех индексных выражений;

-вычислить адрес элемента массива, используя известный нам ме-

тод.

Чтобы вычислить VARPART необходимо преобразовать синтаксис

::=I(|, ::=)

Программа для ::=I( должна найти идентификатор

массива, сгенерировать тетрады для VARPART:= и связать с

адрес элемента ST для d1. ::=I( LOOKUP(I.NAME,P);

-поиск идентификатора IF P=0 OR P.TYPE !=2 -он должен быть в ST и

иметь тип ARRAY.

THEN ERROR(5)

.COUNT:=P.NUMBER-1;-подсчет количества индексов

.ARR:=P; -запомнить адрес описателя массива

.ENTRY:=P+1; -занести в ENTRY адрес элемента ST для d1

GENERATETEMP(P); -генерация временной перем. типа INT для VARPART

P.TYPE:=INTEGER; -запомнить ее адрес

.ENTRY2:=P; -генерация тетрад для преобразования типа, если

CONVERTRI(.ENTRY); они нужны

P:=.ENTRY;

ENTER(:=,P,,.ENTRY2); -генерация тетрады занесения первого

индекса в VARPART

Подпрограмма GENERATETEMP(P) заносит в ST элемент для вре-

менной переменной, а адрес этого нового элемента возвращает в P.

Подпрограмма CONVERTRI(P)проверяет тип P-го элемента ST. Если тип

- INT, то ничего не делается, если REAL, то с помощью

GENERATETEMP заводится новая временная переменная типа INT и ге-

нерируется CVRI-тетрада для преобразования заданной переменной в

тип INT и занесения результата в новую временную переменную. Ука-

затель на временную переменную в ST остается в P. Если тип тип

Р-го элемента не INT и не REAL, то выдается сообщение об ошибке.

Перечислим семантическую информацию (в стеках), связанную с

:

1..ENTRY -адрес элемента ST для d1(для di,если сгенери-

рован код i-го индексного выражения)

2..ENTRY2 -адрес элемента ST для VARPART

3..COUNT -[размерность - i], если сгенерирован код для

i-го индексного выражения

4..ARR -адрес описателя имени массива в ST

Теперь для правила ::=, надо сгенерировать

код, реализующий формулу VARPART:=VARPART*d1+, если это

второе по счету индексное выражение.

::=,

.COUNT:=.COUNT-1; -подсчет индексов

.ARR:=.ARR; -эапомнить тип элемента

.ENTRY:=.ENTRY+1;-в .ENTRY занесли ук-ль на эл-тST для di

P1:=.ENTRY2; -в P1 и в ENTRY2 адреса элемента ST для VARPART

.ENTRY2:=P1;

ENTER(*,P1,.ENTRY,P1); -генерация тетрады VARPART=VARPART*di

P:=.ENTRY; -генерация тетрад преобразования R->I(если надо)

ENTER(+,P!,P,P!); -генерация тетрады VARPART=VARPART+индекс

Заметим, что мы всегда имеем дело не с самим выражением, а с

указателем на элемент ST, описывающий результат вычисления этого

выражения. Для правила ::=) надо проверить (при компи-

ляции) количество индексных выражений и построить элемент STс

описанием элемента массива.

::=)

IF .COUNT!=0

THEN ERROR(6);

GENERATETEMP(P); -генерирование временной переменной для описателя

P.TYPE1%=3; элемента массива

P.TYPE:=.ARR.TYPE; -занести тип1,адресс эл-та ST дляVARPART,

P.ADRESS:=.ENTRY2; адрес эл-та ST, содержащего имя массива

P.NUMBER:=.ARR.NUMBER;

Трансляция описаний массивов

1) В польской записи описание массива

ARRAY A [L1:U1,...Ln:Un] можно представить в виде

L1U1...LnUn A ADEC

2) Для тетрад в виде

BOUNDS L1,U1

...

BOUNDS Ln,Un

ADEC A

Операция ADEC выполняет при семантической обработке следу-

щие действия:

-заносит запись о каждом массиве в ST;

-выделяет для каждого массива две ячейки:одну для хранеия

адреса начала массива, другую - для хранения адреса допвектора;

-формирует в обьектной программе (при генерации кода) коман-

ды, обеспечивающие перед входом в блок:

-вычисление компонент допвектора;

-вычисление адреса хранения массива;

-вычисление адреса хранения допвектора;

-занесение этих адресов в соответствующие ячейки.

Для массивов с постоянными границами компоненты допвектора

вычисляются в ходе трансляции и помещаются среди констант. Чтобы

отличить переменные граничные пары от постоянных нужно ввести до-

полнительный анализ операндов ADEC, являющихся граничными парами.

Допвектора могут располагаться вслед за парой ячеек, выделенной

последнему массиву или среди констант(для массива с постоянными

границами.

ЛЕКЦИЯ 12

СТРУКТУРЫ ДАННЫХ И ОРГАНИЗАЦИЯ ПАМЯТИ

Некоторые применяемые языки требуют динамического распреде-

ления памяти; блоки оперативной памяти при этом выделяются произ-

вольно, а затем освобождаются. Область данных - это блок ОП, вы-

деленный для данных.

Области данных могут принадлежать также к статическому клас-

су. Статическая область данных имеет постоянное число ячеек, а

динамическая область данных не всегда присутствует во время счета.

Если вызов процедуры происходит рекурсивно, то существует

несколько областей данных в ОП, каждая для отдельного вызова про-

цедуры.

Если компилятор знает все характеристики переменных во вре-

мени, то он может сгенерировать полностью команды обращеиня к пе-

ременным, основываясь на этих характеристиках.

Память выделяется компилятором не только для переменных, но

и для описателей, содержащих атрибуты, определяемые во время сче-

та. Этот описатель заполняется и изменяется во время счета. Типы

данных исходной программы должны быть отображены на типы данных

машины. Целые переменные содержатся обычно в одном слове.

Информационные таблицы

При анализе программы из описаний, заголовков процедур, цик-

лов и т.д. извлекается информация и сохраняется для последующего

использования. Эта информация обнаруживается в отдельных точках

программы и организуется так, чтобы к ней можно было обратиться

из любой части компилятора. В каждом компиляторе в той или иной

форме используется таблица символов. Это таблица идентификаторов,

встречающихся в программе, вместе с их атрибутами.

При разборке компилятора невозможно определить вид и содер-

жание информации, которую следует собирать, до тех пор, пока не

будут достаточно обстоятельно продуманы команды обьектной прог-

раммы для каждой инструкции исходной программы и сама синтезирую-

щая часть компилятора.

При проверке правильности семантики и генерации кода тре-

буются знания характеристики идентификатора. Эти характеристики

выясняются из описания и накапливаются в таблице символов. Наип-

ростейшая таблица символов для каждого элемента имеет поле аргу-

мента и значения. Аргументами таблицы являются символы или иден-

тификаторы, а значениями - их характеристики. Так как число ли-

тер в идентификаторе непостоянно, в аргументе часто помещают сим-

волы вместо самого идентификатора. Это позволяет сохранить фикси-

рованный размер аргумента. Идентификаторы хранятся в специальном

списке строк.

При проходе исходной программы через компилятор при встрече

конструкции описания происходит запись идентификатора исходной

программы в таблицу символов вместе с его атрибутами. В результа-

те дальнейшего чтения исходной программы, в компиляторе при на-

хождении любого идентификатора программа обращается к таблице

символов и ищет в ней данный идентификатор. Если идентификатор не

обнаружен, то выдается сообщение, что данный идентификатор не оп-

ределен. Если же он обнаружен, то производится сравнение данного

идентификатора с записанным в таблице символов и производятся

необходимые преобразования.

При работе с таблицей символов нужно разработать правила ор-

ганизации и обращения к таблице символов. Таблицы символов могут

быть как упорядоченными, так и неупорядоченными.

При упорядоченном списке элементов наиболее результативным

является бинарный или логарифмический поиск. Иногда один и тот же

идентификатор может быть описан и использован много раз в различ-

ных блоках и процедурах, и каждое такое описание должно быть

единственным. Соответственно нужно разделять таблицу симводов.

При этом устанавливается правило нахождения соответствующего

идентификатора. Оно состоит в следующем: сначала просматривается

текущий блок, затем обьемлющий блок и т.д., до тех пор, пока не

будет найдено описание данного идентификатора.

При осуществлении поиска все элементы таблицы хранятся для

каждого блока в смежных ячейках и используется список блоков.

Информация об идентификаторе хранится в той части таблицы,

которую мы определили как "значение".

Таблица символов состоит из 5-ти различных списков:

- список меток;

- список арифметических констант;

- список имен общих блоков,имен подпрограмм и имен перемен-

ных;

- список общих блоков;

- список имен подпрограмм.

Элементы всех этих списков помещаются в одной и той же таб-

лице; первые два байта каждого элемента используются для ссылки

на следующий элемент в том же списке.

ЛЕКЦИЯ 13

ВНУТРЕННИЕ ФОРМЫ ИСХОДНОЙ ПРОГРАММЫ

Ввиду сложности реальных языков программирования и предъяв-

ления повышенных требований к эффективности самого процесса ком-

пиляции и к готовым программам, разработчики вынуждены проектиро-

вать многопроходные компиляторы. При этом для связи между прохо-

дами, необходимы внутренние (промежуточные) формы исходной прог-

раммы. В большинстве внутренних форм, операторы располагаются в

том порядке, в котором они должны выполняться, что означает пос-

ледующий анализ и итерацию об'ектного кода. (Эти внутренние пред-

ставления можно использовать для интерпретации).

Внутренняя форма является более развернутым представлением

исходной программы, к которой предъявлялись требования лаконич-

ности и краткости. Более подробное представление обеспечивает

проведение глубокого анализа и оптимизации программ.

Как правило, в одном компиляторе для разных синтаксических

единиц (выражений, условных операторов, операторов присваивания и

т.д.) используются разные, наиболее подходящие с точки зрения

разработчика, внутренние формы.

1.1. Опреанды и операторы

Внутренние формы содержат операторы и операнды. В различных

видах представлений существенное отличие заключается в форме сое-

динения операторов и операндов.

Операторы: + , - , / , * , BR (branch) и т.п. Операнды : -

простые имена (переменных, процедур и т.д.);

- константы;

- временные переменные, генерируемые компилятором;

- переменные с индексами.

Каждый операнд (за исключением переменных с индексом) пред-

ставляется указателем на соответствующий элемент в таблице симво-

лов, констант или временных переменных.

В поле операнда предусматривается признак косвенной адреса-

ции, чтобы указать таким путем, что значение в таблице, на кото-

рое указывает операнд, является адресом расположения значения,

которое требуется операнду при исполнении команды.

Пременную с индексами А[i,j,...,k] можно обрабатывать сле-

дующим образом:

- сначала включить последовательность операций для вычисления

VARPART и запоминания ее во внешней ячейке Т;

- сам операнд представить двумя указателями: на элемент с име-

нем массива и на значение VARPART, т.е. А[i,j,...,k] можно

представить в виде А[T]. Такой операнд занимает две ячейки

во внутреннем представлении, но зато позволяет генерировать

более эффективную объективную программу. Простая переменная

┌───┬───┬─────────────────────────────────────┐

│ 1 │ I │ указатель на эл-т таблицы символов │ I - признак

└───┴───┴─────────────────────────────────────┘ косвенной

Константа адресации

┌───┬───┬─────────────────────────────────────┐

│ 2 │ │ указатель на эл-т таблицы констант │

└───┴───┴─────────────────────────────────────┘

Временная переменная

┌───┬───┬─────────────────────────────────────┐

│ 3 │ I │ указатель на эл-т табл. врем. перем.│

Характеристики

Тип файла
Документ
Размер
1,13 Mb
Тип материала
Учебное заведение
Неизвестно

Список файлов реферата

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6505
Авторов
на СтудИзбе
302
Средний доход
с одного платного файла
Обучение Подробнее