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