Автор: Пользователь скрыл имя, 17 Июля 2015 в 11:39, курсовая работа
Традиционная архитектура компьютера (архитектура фон-Неймана) остается неизменной и преобладает в современных вычислительных системах. Столь же неизменными остаются и базовые принципы, на основе которых строятся средства разработки программного обеспечения для компьютеров – трансляторы, компиляторы и интерпретаторы.
С одной стороны, компьютеры традиционной архитектуры умеют понимать только язык машинных команд. С другой стороны, разработчики не имеют возможности создавать прикладные и системные программы на уровне машинных кодов – слишком велик процент ошибок и непомерно велика трудоемкость такой работы.
Введение 3
1 Задание 4
2 Организация таблицы идентификаторов 6
2.1 Исходные данные 6
2.2 Назначение таблиц идентификаторов 6
2.3 Метод цепочек 7
2.4 Метод бинарного дерева 7
2.5 Результаты 7
3 Проектирование лексического анализатора 10
3.1 Исходные данные 10
3.2 Принципы работы лексических анализаторов 10
3.3 Схема распознавателя 11
3.4 Результаты 12
4 Построение дерева вывода 14
4.1 Исходные данные 14
4.2 Синтаксический анализатор 14
4.3 Результаты 18
5 Генерация и оптимизация объектного кода 20
4.1 Исходные данные 20
4.2 Построение списка триад 20
4.3 Генерация ассемблерного кода 21
4.4 Результаты 22
Заключение 23
Список использованных источников 24
Результатом работы должна быть построенная на основании заданного предложения грамматики программа на объектном языке. В качестве объектного языка предлагается взять язык ассемблера для процессоров типа Intel 80x86 в реальном режиме. Все встречающиеся в исходной программе идентификаторы считать простыми скалярными переменными, не требующими выполнения преобразования типов.
Разработка данной части работы разбивается на два этапа – построение списка триад и генерация ассемблерного кода.
5.2 Построение списка триад
При построении списка триад производится рекурсивный проход дерева вывода, построенного синтаксическим анализатором, описанным в разделе 4. При этом вводятся следующие дополнительные типы триад:
– Триада if (a,b), где операнды a и b обязательно являются ссылками на триады. Смысл данной триады состоит в следующем: если результат вычисления триады a, являющейся логическим выражением, равен нулю, то производится переход по ссылке b. Иначе производится последовательный переход к следующей по списку триаде.
– Триада jmp (1, a), где первый операнд не несет смысловой нагрузки, а второй указывает ссылку на триаду, к которой на следующем этапе должен быть произведен безусловный переход.
Выражения исходного языка, не несущие семантической нагрузки, не порождают новых триад, но для таких узлов дерева вывода производится рекурсивный вызов функции построения триад.
Остальные выражения однозначно преобразуются в одну или несколько последовательных триад.
По завершении построения списка триад производится его оптимизация в виде исключения лишних операций. При этом используется еще один дополнительный тип триады – SAME (a, 0), где второй операнд не несет смысла, а первый указывает на триаду, которой идентична триада, которая была заменена на данное выражение.
5.3 Генерация ассемблерного кода
Генерация ассемблерного кода на основе списка триад не требует дополнительных преобразований, каждая триада может быть однозначно заменена на некоторую последовательность ассемблерных команд. При этом основной проблемой является правильное распределение регистров микропроцессора во время выполнения ассемблерного кода. Решение данного вопроса соответствует методу, предложенному в методических указаниях к курсовой работе [2].
Перед вставкой списка ассемблерных комнд, соответствующих текущей триаде, проверяется необходимость изменения содержимого аккумулятора. Если в нем уже содержится необходимое значение, его изменение является лишним, иначе первой из порожденных команд является команда mov. Аналогично, при необходимости сохранения результата выполнения операции (в случае, если он вызывается в следующих далее операциях), он сохраняется в одном из регистров.
5.4 Результаты
За генерацию списка триад отвечают модули Triad, TriListMaker и TriListOptimizer. Класс Triad определяет структуру, соответствующую одной триаде. Модуль TriListMaker генерирует первоначальный список триад на основе синтаксического дерева вывода, а модуль TriListOptimizer производит его оптимизацию в виде исключения лишних операций. Как только заканчивается оптимизация триад, результирующий список триад отправляется модулю AsmGenerator - модулю, отвечающему за генерацию ассемблерного кода. Результатом работы модуля AsmGenerator является результирующий объектный код на основе входного текстового файла. Результаты данных операций выводятся на экран при помощи модулей TriTab и AsmTab соответственно.
6 Описание работы программы
6.1 Реализация таблицы идентификаторов
На рисунке 5 представлено главное окно программной реализации таблицы идентификаторов.
Рисунок 5 – Главное окно
После загрузки файла происходит автоматическое заполнение таблицы идентификаторов. После этого появляется возможность поиска необходимых идентификаторов в этой таблице. При нажатии на кнопку "Найти все" происходит поиск всех идентификаторов из входного файла и выдается статистика, указывающая количество сравнений при поиске текущего идентификатора, а также общее и среднее число сравнений (рисунок 6).
Рисунок 6 – Статистика сравнений при поиске идентификаторов
Для наглядного представления структуры таблицы идентификаторов есть возможность ее просмотра в виде иерархического дерева (рисунок 7).
Рисунок 7 – Иллюстрация структуры таблицы идентификаторов
Исходный текст программы приведен в приложении А.
6.2 Программная реализация лексического анализатора
На основе графа конечного детерминированного автомата, приведенного в разделе 3, была разработана программная реализация лексического анализатора.
Вкладка загрузки файла (рисунок 8) предоставляет пользователю возможность выбора загружаемого файла, его просмотра, а также просмотра строки с ошибкой в случае лексической ошибки.
Рисунок 8 – Вкладка загрузки файла
Результаты работы лексического анализатора выводятся во вкладке "Таблица лексем" (Рисунок 9). Там же приводится подробный лог его работы.
Рисунок 9 – Вкладка "Таблица лексем"
В случае лексической ошибки во входном файле на экран выводится сообщение об ошибке и во вкладке загрузки файла строка с ошибкой подсвечивается красным цветом (Рисунок 10).
Рисунок 10 – Вывод ошибки
6.3 Программная реализация синтаксического анализатора
Реализация синтаксического анализатора аналогична программной реализации лексического анализатора.
Во вкладке "Синтаксис" выводится результат работы анализатора – дерево вывода (Рисунок 11). В этой же вкладке выводится и подробный лог его работы.
Рисунок 11 – Вкладка "Синтаксис"
Аналогично тому, как производится информирование об обнаруженной лексической ошибке, реализовано сообщение о синтаксической ошибке.
6.4 Реализация генерации и оптимизации объектного кода
Во вкладке "Триады" выводится информация о генерации триад и их оптимизации (рисунок 12). Выданному варианту задания соответствует оптимизация в виде исключения лишних операций. Ее результаты и подробный лог работы модуля представлены в этой же вкладке.
Рисунок 12 – Вкладка "Триады"
Результаты преобразования триад в код ассемблера выделены в отдельную вкладку "Команды" (рисунок 13). Эти результаты и являются результатом работы всей программы.
Рисунок 13 – Вкладка "Команды"
Исходные коды для модулей, описанных в разделах 6.2, 6.3 и 6.4, представлены в приложении Б.
Заключение
В процессе выполнения курсовой работы была разработана и программа, реализующая компилятор заданного подмножества языка Паскаль с незначительными модификациями. Для ее разработки использовалась среда программной разработки Microsoft Visual Studio .NET 2003 с дополнительно интегрированной библиотекой классов Trolltech Qt v4.0.1.
Приложение A. Исходный текст программы
main.cpp
#include <QtGui/QApplication>
#include "MainDialog.h"
#include <QTextCodec>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForTr(
a.setStyle("windowsxp");
MainDialog w;
w.show();
a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
return a.exec();
}