- •Введение.
- •1 Задание на проектирование
- •2 Цели и требования
- •3 Внешний проект
- •3.1 Входные и выходные данные
- •3.2 Определение синтаксиса языка
- •3.3 Общая структура проекта
- •3.4 Структура выходного файла
- •3.5 Организация листинга
- •4 Проект архитектуры
- •4.1 Структуры данных
- •4.2 Алгоритмы основных функций
- •4.3 Схема вызовов процедур и функций
- •4.4 Организация процедуры компиляции
- •4.5 Спецификация основных процедур и функций
- •4.6 Обработка ошибок
- •5 Реализация
- •5.1 Тестирование
- •5.2 Документация для пользователя
4.3 Схема вызовов процедур и функций
синтаксического анализатора
compiller-2—main -- Syntax_Analiz_1
|
NextLexema
|
p_prog—isWord—InsertGIT
|
p_var—NextLex—isWord—isOperator—GetTypeByWord—InsertGIT
|
p_func—isWord—Syntax_Analiz_1
|
p_beg—isOperator--insertBlock
|
p_end—error
4.4 Организация процедуры компиляции
Процедура компиляции состоит из следующих этапов:
Подготовка к компиляции
Проверка лексики входного файла
Проверка синтаксиса входного файла
Проверка блочной структуры входного файла
Генерация кода
Вывод кода ошибки при ее обнаружении
4.5 Спецификация основных процедур и функций
lpdgram *p_block(int b)
{Входные параметры: номер разбираемого блока
Выходные параметры: массив из бинарных деревьев (диаграмм Вирта)
Выполняемая функция: преобразование таблицы лексем к таблице идентификаторов и массивам диаграмм Вирта
}
lpdgram p_codeline(int b)
{Входные параметры: номер разбиваемого блока
Выходные параметры: бинарное дерево (диаграмма Вирта)
Выполняемая функция: преобразование одной строки на языке Pascal из таблицы лексем в диаграмму Вирта
}
int getnumArg(int f)
{Входные параметры: индекс функции в таблице идентификаторов
Выходные параметры: количество аргументов функции
Выполняемая функция: получение количества аргументов для функции, заданной индексом в таблице идентификаторов
}
operations operationType(char * op, int block)
{Входные параметры: символьное представление операции (лексема) и блок, в котором она находится
Выходные параметры: тип операции
Выполняемая функция: определение типа диаграммы Вирта
}
lpdgram initDgram(operations type, int ext, lpdgram left, lpdgram right)
{Входные параметры: тип операции, индекс в таблице идентификаторов (для переменных и функций) или значение константы (для константы), левая и правая связи
Выходные параметры: корень дерева кода
Выполняемая функция: инициализация элемента или корня дерева кода
}
void dropDgram(lpdgram Dgram)
{Входные параметры: корень или элемент дерева
Выходные параметры: нет
Выполняемая функция: освобождение памяти из-под диаграммы Вирта
}
void atLexima(int sl, int sw)
{Входные параметры: индексы в таблице лексем
Выходные параметры: нет
Выполняемая функция: переход к указанному слову в таблице лексем
}
void rewindLexima(void)
{Входные параметры: нет
Выходные параметры: нет
Выполняемая функция: переход на одну лексему назад
}
char * nextLexima(void)
{Входные параметры: нет
Выходные параметры: лексема
Выполняемая функция: получение новой лексемы из таблицы лексем
}
int Delimeter(char * line)
{Входные параметры: символьная строка
Выходные параметры: код разделителя
Выполняемая функция: определение типа и кода разделителя
}
int isOperator(char * line)
{Входные параметры: символьная строка
Выходные параметры: код оператора
Выполняемая функция: определение, является ли line оператором, если является, то определяется его код, если нет – возвращается -1
}
int isKeyWord(char * line)
{Входные параметры: символьная строка
Выходные параметры: код ключевого слова
Выполняемая функция: определяет, является ли line ключевым словом, возвращает его код, если является
}
BOOL Syntax_Analiz_1(void)
{Входные параметры:нет
Выходные параметры: true – анализ успешен, false – обнаружена ошибка
Выполняемая функция: преобразование программы к блокам кода, извлечение идентификаторов в таблицу идентификаторов и подготовка к разбиению блоков на строки диаграмм Вирта
}
void p_program(void)
{Входные параметры: нет
Выходные параметры: нет
Выполняемая функция: обработка ключевого слова program и помещение его в таблицу GIT (Global Ident Table)
}
void p_var(int _ext)
{Входные параметры: тип хранения переменной: переменная локальная для функции, глобальная для программы или параметр для вызова функции
Выходные параметры: нет
Выполняемая функция: обработка ключевого слова var и помещение его в таблицу GIT (Global Ident Table)
}
void p_function(void)
{Входные параметры: нет
Выходные параметры: нет
Выполняемая функция: обработка ключевого слова function и помещение его в таблицу GIT (Global Ident Table)
}
void p_begin(void)
{Входные параметры: нет
Выходные параметры: нет
Выполняемая функция: обработка ключевого слова begin, создание метки блока, добавление нового блока к таблице блоков, создание связи блока с таблицей идентификаторов
}
void p_end(void)
{Входные параметры: нет
Выходные параметры: нет
Выполняемая функция: обработка ошибки отсутствия соответствующего ключевого слова begin
}
BOOL p_other_sym(char * lex)
{Входные параметры: lex – лексема
Выходные параметры: true – продолжать анализ, false – анализ прекратить
Выполняемая функция: анализ дополнительных лексем (например ;)
}
BOOL insertGIT(char * lex, IdentTypes type, unsigned int ext, unsigned long val)
{Входные параметры: лексема, тип идентификатора, тип хранения переменной: переменная локальная для функции, глобальная для программы или параметр для вызова функции, значение
Выходные параметры: успешно добавлен элемент или нет
Выполняемая функция: добавляет элемент в таблицу идентификаторов
}
int searchGIT(char * name)
{Входные параметры: имя лексемы
Выходные параметры: номер строки в таблице идентификаторов, -1 в случае не обнаружения идентификатора
Выполняемая функция: осуществляет поиск идентификаторов в таблице и возвращает номер строки в случае, если она найдена.
}
int searchGITfrom(char * name, int _from)
{Входные параметры: имя лексемы; номер блока, с которого осуществляется поиск
Выходные параметры: номер строки в таблице идентификаторов, -1 в случае не обнаружения идентификатора в таблице
Выполняемая функция: осуществляет поиск идентификатора в таблице для определенного блока, с учетом его “видимости”
}
int searchGITblock(char * name, int block)
{ Входные параметры: имя лексемы; номер блока, с которого осуществляется поиск
Выходные параметры: номер строки в таблице идентификаторов, -1 в случае не обнаружения идентификатора в таблице
Выполняемая функция: осуществляет поиск идентификатора в таблице для определенного блока, внутри его
}
int searchGITto(char * name, int block)
{Входные параметры: имя лексемы; номер блока, с которого осуществляется поиск
Выходные параметры: номер строки в таблице идентификаторов, -1 в случае не обнаружения идентификатора в таблице
Выполняемая функция: осуществляет поиск идентификатора в таблице для определенного блока, внутри его, в глобальном пространстве и передаваемых функции параметров
}
int insertBlock(int varIdx)
{Входные параметры: индекс начала блока в таблице идентификаторов
Выходные параметры: индекс добавленного блока
Выполняемая функция: добавление блока к таблице блоков
}
void addBlockStart(void)
{Входные параметры: нет
Выходные параметры: нет
Выполняемая функция: изменение метки начала блока в таблице блоков
}
void addBlockEnd(void)
{Входные параметры: нет
Выходные параметры: нет
Выполняемая функция: изменение метки конца блока в таблице блоков
}
void freeGIT(void)
{Входные параметры: нет
Выходные параметры: нет
Выполняемая функция: освобождение памяти от таблицы идентификаторов
}
void freeBlock(void)
{Входные параметры: нет
Выходные параметры: нет
Выполняемая функция: освобождение памяти от блоков кода
}
BOOL isWord(char * tmp)
{Входные параметры: слово
Выходные параметры: true в случае, если слово, false – если нет.
Выполняемая функция: определение, принадлежит ли tmp к словам или нет
}
int GetIdentTypeByWord(char * type)
{Входные параметры: символьная строка
Выходные параметры: -1 – ошибка, иначе код для типа
Выполняемая функция: получение типа идентификатора по его символьному названию (integer)
}