ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 26.10.2023
Просмотров: 34
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное бюджетное образовательное учреждение высшего образования
«Тольяттинский государственный университет»
Институт математики, физики и информационных технологий
(наименование института полностью) |
Кафедра «Прикладная математика и информатика» |
(Наименование учебного структурного подразделения) |
02.03.03 Математическое обеспечение и администрирование информационных систем |
(код и наименование направления подготовки / специальности) |
Мобильные и сетевые технологии |
(направленность (профиль) / специализация) |
Практическое задание № 4
по учебному курсу «Теоретические основы информатики»
(наименование учебного курса)
Обучающегося | Маков М.Р. | |
| (И.О. Фамилия) | |
Группа | МОб-2102а | |
| | |
Преподаватель | Любивая Т.Г. | |
| (И.О. Фамилия) | |
Тольятти 2023
Разработка генератора результирующего кода
Выбор и описание форм внутреннего представления программы, используемых в компиляторе с обоснованием сделанного выбора
В качестве формы внутреннего представления программы были выбраны триады. Они представляют собой запись операций в форме из трёх составляющих операции и двух операндов и имеет следующий вид: <операция> (<операнд1>, <операнд2>).
Дерево операций, полученное из дерева разбора в пункте 3.2 представлено на рисунке 18.
Рисунок 18 – Дерево операций
Преобразования узлов дерева операций в триады представлены в таблице 9.
Операция | Выходной код |
if | Триада if(L,R), где L – ссылка на триаду с условием R – ссылка на триаду, соответствующую началу блока кода else |
not | Триада not(1,R), где 1 – пустой операнд (т.к. это унарная операция) R – ссылка на триаду с условием |
and, or, <, >, =, :=, -, +, *, / | <операция>(L,R), где L – левый операнд или ссылка на триаду R – правый операнд или ссылка на триаду |
Таблица 9 – Преобразования узлов дерева операций
Разработка алгоритма порождения результирующего кода
Для условного оператора генерация кода может выполняться в следующем порядке:
-
Порождается блок кода №1, вычисляющий логическое выражение, находящееся перед лексемой «?» (вторая нижележащая вершина). Для этого должна быть рекурсивно вызвана функция порождения кода для первой нижележащей вершины. -
Порождается команда условного перехода, которая передает управление в зависимости от результата вычисления логического выражения:
-
в начало блока кода № 2, если логическое выражение имеет ненулевое значение; -
в начало блока кода № 3, если логическое выражение имеет нулевое значение.
-
Порождается блок кода №2, соответствующий операциям после лексемы «?» (вторая нижележащая вершина) – для этого должна быть рекурсивно вызвана функция порождения кода для третьей нижележащей вершины. -
Порождается команда безусловного перехода в конец оператора. -
Порождается блок кода №3, соответствующий операциям после лексемы «:» (четвёртая нижележащая вершина) – для этого должна быть рекурсивно вызвана функция порождения кода для пятой нижележащей вершины.
Схема СУ-перевода для операции not будет выглядеть следующим образом:
-
Порождается блок кода для единственного операнда. Для этого рекурсивно вызывается функция порождения кода, в качестве первого аргумента ей передаётся адрес А2, а в качестве второго аргумента – адрес А1 (аргументы меняются местами).
Для всех остальных операций генерация кода может выполняться в следующем порядке:
-
Порождается блок кода №1 для первого операнда. Для этого рекурсивно вызывается функция порождения кода для первой нижележащей вершины, в качестве первого аргумента ей передаётся адрес А1, а в качестве второго аргумента – адрес блока кода №2.
-
Порождается блок кода №2 для второго операнда. Для этого рекурсивно вызывается функция порождения кода для третьей нижележащей вершины, в качестве первого аргумента ей передаётся адрес А1, а в качестве второго аргумента – адрес А2.
Для проверки работоспособности генератора результирующего кода использовался выходной файл синтаксического разборщика «derevo_v.txt», содержащий дерево синтаксического разбора.
После работы программы на выходе образуются два файла: дерево операций в «derevo_operations.txt» и список триад в «triads.txt».
Дерево операций, полученное после преобразования дерева синтаксического разбора представлено на рисунке 19.
Рисунок 19 – Дерево операций
Список триад, полученный в результате работы генератора результирующего кода представлен на рисунке 20.
Рисунок 20 – Список триад
Интеграция разработанных компонент в компилятор
По ходу выполнения курсовой работы было разработано 4 программы: генератор таблицы идентификаторов, лексический анализатор, синтаксический разборщик и генератор результирующего кода. Был создан проект в среде программирования Visual Studio 2022, в котором объединены все компоненты через единый заголовочный файл. Все компоненты программы указаны в таблице 10.
Название файла | Описание файла |
input.txt | Файл с текстом исходной программы |
out_LA.txt | Файл с таблицей лексем |
derevo_v.txt | Файл с деревом синтаксического разбора |
triads.txt | Файл со списком триад |
LexAnalyser.cpp | Файл с реализацией лексического анализатора |
SyntaxAnalyser.cpp | Файл с реализацией синтаксического разборщика |
CodeGen.cpp | Файл с реализацией генератора результирующего кода |
Compiler.exe | Скомпилированный исполняемый файл |
Таблица 10 – Компоненты программы
Разработанные компоненты в компиляторе будут выполнятся в следующей последовательности:
-
Текст входной программы считывается и обрабатывается лексическим анализатором, в результате работы которого образуется файл, содержащий таблицу лексем. -
Файл с таблицей лексем считывается и обрабатывается синтаксическим разборщиком, в результате работы которого образуется файл, содержащий дерево синтаксического разбора. -
Файл с деревом синтаксического разбора считывается и обрабатывается генератором результирующего кода, в результате работы которого образуется файл, содержащий список триад.
Описание разработанного компилятора
Исполняемый файл называется Compiler.exe. Запуск программы осуществляется с помощью командной строки или терминала. При запуске необходимо указать название исполняемого файла, а также название файла с текстом входной программы input.txt. Пример команды для запуска программы в командной строке указан в листинге 1.
Compiler.exe input.txt |
Листинг 1 – Пример команды для запуска программы с помощью командной строки
При запуске программы в терминале, запись будет выглядеть так:
.\Compiler.exe input.txt |
Листинг 2 – Пример команды для запуска программы с помощью терминала
В результате работы компилятор создаст следующие объекты: файл с деревом операций «derevo_operations.txt», файл с деревом синтаксического разбора «derevo_v.txt», файл с таблицей идентификаторов «out_id_LA.txt», файл с таблицей лексем «out_LA.txt», файл со свёрткой текста входной программы «out_SR.txt», файл с цепочкой правил «Rules.txt» и файл со списком триад «triads.txt».