- •Пояснительная записка
- •1 Формальная постановка задачи
- •2 Описание входного языка
- •2.1. Синтаксис входного языка
- •2.2. Семантика входного языка
- •2.2.1.Встроенные типы данных входного языка
- •2.2.2.Операции входного языка и их приоритет
- •2.2.3.Конструкции входного языка
- •3 Описание этапа лексического анализа
- •3.1 Описание типов лексем
- •3.2 Функции лексического анализатора
- •3.3 Тестирование лексического анализатора
- •4 Описание этапа синтаксического анализа
- •4.1 Исходная порождающая кс-грамматика
- •4.2 Разбиение исходной грамматики на подграмматики
- •4.3. Разработка дмп-процессора, порожденного исходной грамматикой
- •4.3.1 Алгоритм разбора для ll(1)-грамматик
- •4.3.2 Взаимодействие дмп-процессоров
- •4.3.3 Алгоритм работы дмп-процессора
- •4.3.4 Управляющие таблицы дмп-процессоров
- •4.3. Описание перевода во внутренний язык
- •4.3.1 Формат тетрады
- •4.3.2 Формат тетрад для представления основных операторов
- •4.3.3 Представление основных операторов(описанных в разделе семантики) с помощью тетрад
- •4.4.4 Взаимодействие атг с имеющимися таблицами лексического анализатора
- •4.4.5 Разработка атрибутной транслирующей грамматики
- •4.4.6 Описание используемых операционных символов
- •4.4.7 Атрибутный перевод дляLl(1)-грамматик
- •4.4.8 Атрибутный дмп-процессор
- •4.4.9 Тестовый пример
- •Список литературы
- •Приложение 1 Тестирование дмп-процессора
4.3.3 Представление основных операторов(описанных в разделе семантики) с помощью тетрад
Оператор |
Формат оператора | |||
Код операции |
Операнд1 |
Операнд2 |
Результат | |
if<выражение> <составной оператор1> else <составной оператор2> ;
|
<выражение>(результат вt) | |||
BF |
Lelse |
t |
| |
<составной оператор1> | ||||
BRL |
Lend |
|
| |
DEFL |
Lelse |
|
| |
<составной оператор2> | ||||
DEFL |
Lend |
|
| |
(<логическое выражение>)? < выражение1>: < выражение2 > |
<логическое выражение >(результат в t) | |||
BF |
Lelse |
t |
| |
= |
<выражение1> |
|
t1 | |
BRL |
Lend |
|
| |
DEFL |
Lelse |
|
| |
= |
<выражение2> |
|
t1 | |
DEFL |
Lend |
|
| |
for(<оператор присваиванияН>; <логическое выражение>; <оператор присваиванияК>) {<составной оператор>} |
<оператор присваиванияH> |
i |
|
i |
DEFL |
Lbegin |
|
| |
<логическое выражение >(результат в t) | ||||
BF |
Lend |
t |
| |
<составной оператор> | ||||
<оператор присваиванияK> |
i |
|
i | |
BF |
Lbegin |
t |
| |
DEFL |
Lend |
|
| |
goto <метка> |
BRL |
метка |
|
|
<оператор присваивания> |
= |
|
t2 |
t1 |
4.4.4 Взаимодействие атг с имеющимися таблицами лексического анализатора
На этапе лексического анализа были получены таблицы лексем, соответствующие заданной входной последовательности языка. Определим взаимодействие АТГ с этими таблицами.
Таблица идентификаторов(№ 24) – это уже будет таблица идентификаторов синтаксического анализатора
Прежде всего нам придется слегка дополнить имеющуюся таблицу идентификаторов, так как теперь нам будет важно не только символьное значение этого идентификатора. Если идентификатор обозначает некую переменную, то нам необходимо знать не её тип и текущее значение.
Индекс |
Идентификатор |
Тип |
Значение |
|
|
|
|
Таблица идентификаторов предназначена для хранения информации о переменных. Также в ней хранятся промежуточные результаты вычислений, для которых значение поля Идентификатор не имеет значения. Для получения номера свободной строки служит функция GetNew.
Для проверки совместимости типов хранимых в таблице значений, сначала сравниваются значения полей «Тип». Если эти значения (имена типов) одинаковые, то значения имеют один. Если же они имена типов разные, то это не значит, что переменные не совместимы. В этом случае выполняется сравнение соответствующих записей в таблице типов. Если же и они разные, то значения безусловно имеют разные типы, но всё-таки возможно совместимые (например integer и real или строки разной длины).
Примем для векторов следующее допущение. Пусть на этапе лексического анализа(то есть составления таблицы идентификаторов) под n-размерный вектор выделяется n+1 строк.
Например, для вектора а[3]=[2.0, 3.0 , 4,1] (элементы вектора хранятся в таблице вещественных констант)
Индекс |
Идентификатор |
Тип |
Значение |
0 |
a |
vector |
|
1 |
a1 |
|
Указатель на 2.0 в таблице вещественных констант |
2 |
a2 |
|
Указатель на 3.0 в таблице вещественных констант |
3 |
a3 |
|
Указатель на 4.1 в таблице вещественных констант |
Таблица меток(№27)
Структура таблицы меток не требует изменений и останется прежней.
№ |
Имя |
|
|
Таблица меток содержит имена всех меток, описанных пользователем. Также в ней хранятся метки, создаваемые транслятором для организации ветвлений и циклов. Для генерации таких специальных меток служит функция NewLаbel. При вызове NewLabel транслятор генерирует новое уникальное имя метки, заносит его в незанятую строку таблицы и возвращает номер этой строки.