4. Проект архитектуры
Алгоритм работы:
Работу данного компилятора можно разбить на три основные части:
Генерация таблицы идентификаторов
На данном этапе из входного файла считывается строка либо же её некоторая часть и определяется переменная какого типа и с каким именем описана в данной строке, после этого она помещается в таблицу идентификаторов.
Генерация кода и его запись в некоторый временный файл
На данном этапе из входного файла считывается строка либо же её некоторая часть и определяется класс лексемы (метка, выражение, условие, переход) и в зависимости от этого вызывается соответствующая функция генерации кода
Cоздание окончательного asm файла
В связи с тем, что при вычислении выражений промежуточные вычисления хранятся в переменных, которые добавляет сам компилятор, для генерации конечного файла требуется полная информация по всем используемым переменным.
Работа на данном этапе сводится к тому чтобы добавить в ассемблерный файл объявления дополнительных переменных, дописать процедуру вывода на экран, скопировать код, полученный на втором этапе и записать в конечный файл.
Спецификации функций:
void geuUnicName(char firstFor[5],int n,char uni[ID_NAME_SIZE]);
генерарция уникального имени
SentenseType analyseSentense()
Возвращает какое ключевое слово находится в прочитанной строке
void gotoToAsm()
генерация ассемблерского кода для оператора goto
void labelToAsm()
генерация аасемблерского кода для метки
void ifToAsm()
генерация ассемблерного кода для if
Дерево вызовов
Main
|_genIdTable
| |_readUpTo
| | |_error
| |
| |_addToIdTable
| | |_IdTable.add
| |
| |_ stringComp
| |_error
| |_correctIdentifier
| |_stringComp
|
|_reinterpret
| |_readUpTo
| | |_error
| |
| |_gotoToAsm
| | |_IdTable.find
| | |_error
| |
| |_labelToAsm
| | |_IdTable.find
| | |_error
| |
| |_analyseSentense
| | |_stringComp
| |
| |_ifToAsm
| | |_stringComp
| | |_error
| | |_readUpTo
| | |_genUnicName
| | |_reinterpret
| |
| |_createPolishString
| | |_Stack.push
| | |_Stack.pop
| | |_Stack.getFirst
| | |_error
| |
| |_exprToAsm
| | |_genUnicName
| | |_modifyExpr
| |
| |_writeToAsm
| | |_IdTable.find
| | |_error
| |
| |_stringComp
| |_reinterpret
| |_error
|
|_genEndFile
|_stringComp
|_genUnicName