Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
71
Добавлен:
02.05.2014
Размер:
610.3 Кб
Скачать

Содержание

Лист

Введение

2

1 Задание

3

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

Приложение А. Исходный текст программы

Введение

Традиционная архитектура компьютера (архитектура фон-Неймана) остается неизменной и преобладает в современных вычислительных системах. Столь же неизменными остаются и базовые принципы, на основе которых строятся средства разработки программного обеспечения для компьютеров – трансляторы, компиляторы и интерпретаторы.

С одной стороны, компьютеры традиционной архитектуры умеют понимать только язык машинных команд. С другой стороны, разработчики не имеют возможности создавать прикладные и системные программы на уровне машинных кодов – слишком велик процент ошибок и непомерно велика трудоемкость такой работы. Поэтому давно возникла потребность в появлении "переводчиков" с различных языков программирования (языков ассемблера и языков высокого уровня) на язык машинных кодов. Такими переводчиками стали трансляторы. Есть и более узкое понятие подобного рода – "компилятор".

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

На этих принципах и технологиях построены все средства разработки, которые в настоящее время являются не просто трансляторами и компиляторами, а комплексами, представляющими собой системы программирования.

1 Задание

Курсовая работа заключается в создании компилятора с заданного подмножества языка Паскаль с незначительными модификациями и упрощениями (полное описание входного и выходного языков дано далее в задании для каждого варианта). Результатами курсовой работы являются программная реализация заданного компилятора и пояснительная записка, оформленная в соответствии с требованиями ГОСТ, стандартов Университета и задания на курсовую работу.

Компилятор рекомендуется построить из следующих составных частей:

  1. лексический анализатор;

  2. синтаксический анализатор;

  3. оптимизатор;

  4. генератор результирующего кода.

Для построения компилятора рекомендуется использовать методы, освоенные в ходе выполнения лабораторных работ по курсу «Системное программное обеспечение».

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

  • входная программа начинается ключевым словом program и заканчивается ключевым словом end;

  • входная программа может быть разбита на строки произвольным образом, все пробелы и переводы строки должны игнорироваться компилятором;

  • текст входной программы может содержать комментарии любой длины, которые должны игнорироваться компилятором (вид комментария задан в варианте задания);

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

  • должны быть предусмотрены следующие варианты операторов входной программы:

  • оператор присваивания вида <переменная>:=<выражение>;

  • условный оператор вида if <выражение> then <оператор>, либо if <выражение> then <оператор> else <оператор>;

  • составной оператор вида beginend;

  • оператор цикла, предусмотренный вариантом задания;

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

  • арифметические операции сложения (+) и вычитания (-);

  • операции сравнения меньше (<), больше (>), равно (=);

  • логические операции «и» (and), «или» (or), «нет» (not);

  • дополнительные арифметические операции, предусмотренные вариантом задания;

  • операндами в выражениях могут выступать идентификаторы (переменные) и константы (тип допустимых констант указан в варианте задания);

  • все идентификаторы, встречающиеся в исходной программе, должны восприниматься как переменные, имеющие тип, заданный в варианте задания (предварительное описание идентификаторов в исходной программе не требуется);

Приоритет операций исполнитель работы должен выбрать самостоятельно (приоритет операций учитывается в грамматике входного языка). Для изменения приоритета операций должны использоваться круглые скобки.

В качестве выходного (результирующего) языка должен использоваться язык ассемблера процессоров типа Intel 80x86 в модификации встроенного языка ассемблера компилятора Pascal производства фирмы Borland.

Дополнительные условия, соответствующие варианту задания:

– дополнительные арифметические операции: сдвиги влево (<<) и вправо (>>);

– оператор цикла входного языка: repeat <оператор> until <выражение>;

– оптимизация: исключение лишних операций;

– тип данных: Word;

– тип комментария: комментарий в круглых скобках со «звездочкой»: (*…*).

Для выполнения курсовой работы использована среда программной разработки Microsoft Visual Studio .NET 2003 (язык C++) с дополнительно установленной библиотекой классов Trolltech Qt v4.0.1.