ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 26.10.2023

Просмотров: 33

Скачиваний: 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. Порождается блок кода №1, вычисляющий логическое выражение, находящееся перед лексемой «?» (вторая нижележащая вершина). Для этого должна быть рекурсивно вызвана функция порождения кода для первой нижележащей вершины.

  2. Порождается команда условного перехода, которая передает управление в зависимости от результата вычисления логического выражения:

  • в начало блока кода № 2, если логическое выражение имеет ненулевое значение;

  • в начало блока кода № 3, если логическое выражение имеет нулевое значение.

  1. Порождается блок кода №2, соответствующий операциям после лексемы «?» (вторая нижележащая вершина) – для этого должна быть рекурсивно вызвана функция порождения кода для третьей нижележащей вершины.

  2. Порождается команда безусловного перехода в конец оператора.

  3. Порождается блок кода №3, соответствующий операциям после лексемы «:» (четвёртая нижележащая вершина) – для этого должна быть рекурсивно вызвана функция порождения кода для пятой нижележащей вершины.


Схема СУ-перевода для операции not будет выглядеть следующим образом:


  1. Порождается блок кода для единственного операнда. Для этого рекурсивно вызывается функция порождения кода, в качестве первого аргумента ей передаётся адрес А2, а в качестве второго аргумента – адрес А1 (аргументы меняются местами).

Для всех остальных операций генерация кода может выполняться в следующем порядке:


  1. Порождается блок кода №1 для первого операнда. Для этого рекурсивно вызывается функция порождения кода для первой нижележащей вершины, в качестве первого аргумента ей передаётся адрес А1, а в качестве второго аргумента – адрес блока кода №2.




  1. Порождается блок кода №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 – Компоненты программы
Разработанные компоненты в компиляторе будут выполнятся в следующей последовательности:

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

  2. Файл с таблицей лексем считывается и обрабатывается синтаксическим разборщиком, в результате работы которого образуется файл, содержащий дерево синтаксического разбора.

  3. Файл с деревом синтаксического разбора считывается и обрабатывается генератором результирующего кода, в результате работы которого образуется файл, содержащий список триад.



Описание разработанного компилятора



Исполняемый файл называется 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».