3.5 Спецификация функций

lex* LexAnal(id*,num*,char**,char**,char**,char**)

функция лексического анализатора

Вход: указатели на таблицы

Выход: список лексемм

Действия: формирование списка лексемм

lex* AddLex(lex*,int,int)

функция добавления лексемы

Вход: указатель на конец списка лексемм

Выход: указатель на новый конец списка лексемм

id* AddId(id*,char*)

функция добавления идентификатора в таблицу идентификаторов

Вход: указатель на конец таблицы идентификаторов

Выход: указатель на новый конец таблицы идентификаторов

num* AddNum(num*,int)

функция добавления числа в таблицу чисел

Вход: указатель на конец таблицы чисел

Выход: указатель на новый конец таблицы чисел

Все ошибки обрабатываются внутри функции LexAnal() и на остальные функции вли-яния не оказывают.

3.6 Структура программы

  1. Синтаксический анализатор

Синтаксически-управляемые схемы и транслирующие грамматики позволяют зада-вать соответствия между цепочками входного и выходного языков, называемые переводом. Такие соответствия отражают структурные или синтаксические свойства входных и выход-ных цепочек, но возникают значительные трудности при попытках их использования для описания контекстно-зависимых условий или смысла конструкций-семантики языков про-граммирования.

Для задания семантики применяются различные приемы: W-грамматики, венский ме-таязык, аксиоматический и денотационный методы, а также атрибутные транслирующие грамматики (АТ-грамматики).

Рассматриваемые в настоящем разделе АТ-грамматики отличаются от транслирую-щих грамматик тем, что символам грамматики приписываются атрибуты, отражающие се-мантическую информацию, а правилам грамматики сопоставляются правила вычисления значений атрибутов.

4.1 Неформальное описание семантики

После работы лексического анализатора на вход атрибутного преобразователя будут подаваться лексемы. На этапе описания переменных, мы должны сформировать таблицу зна-чений, выделить под каждую описанную переменную память в этой таблице и записать в таблице переменных ссылку на ячейку в таблице значений.

Таблица переменных будет совпадать с таблицей идентификаторов, но в структуру каждого элемента таблицы идентификаторов добавим поле с указателем на элемент таблицы значений.

Когда на вход подается цепочка лексемм, мы находим переменную из описания, ко-торая имеет атрибут указавающий на таблицу переменных (ТИ), смотрим была ли описана она ранее. Если была, то выход с кодом ошибки. Если нет, то добавляем в структуру пере-менной ее тип, выделяем память соответствующую ее типу в таблице значений и записываем ссылку в структуру переменной.

Если мы описываем массив, то мы в структуру переменной в ТП заносим информа-цию о массиве (размерность, размер массива для каждого уровня), проверяем на допусти-мость размерность, количество элементов. После чего выделяем память в ТЗ, состоящей из N элементов, , где Xi – размеры соответствующих уровней. И далее запи-сываем указатель в ТП на начало этого поля памяти (первый элемент массива).

При описании с инициализацией необходимо проверять соответствие типов присва-иваемых значений и переменных.

Операции могут выполняться с двумя типами данных Bool и Char. Операции не могут выполняться,если в них используются операнды различного типа. Чтобы это учесть введем в структуру ячейки памяти поле type(1-bool,0-char), которое и будет указывать нам тип пере-менной, значение которой хранится в данной ячейке. Также в выполнении операции не могут участвовать переменные (элементы массива), которые не были инициализированны.

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

Соседние файлы в папке Курсовой проект по дисциплине Формальные грамматики, языки и автоматы