Автор работы: Пользователь скрыл имя, 14 Сентября 2013 в 13:58, курсовая работа
Цель работы: изучение составных частей, основных принципов построения и функционирования компиляторов, практическое освоение методов построения простейших компиляторов для заданного входного языка.
Курсовая работа заключается в создании компилятора с заданного подмножества языка. Результатами курсовой работы являются программная реализация заданного компилятора и пояснительная записка, оформленная в соответствии с требованиями стандартов и задания на курсовую работу.
Курсовая работа по предмету «Системное программное обеспечение»
4-й курс (2011 год)
Цель работы: изучение составных частей, основных принципов построения и функционирования компиляторов, практическое освоение методов построения простейших компиляторов для заданного входного языка.
Курсовая работа заключается в создании компилятора с заданного подмножества языка. Результатами курсовой работы являются программная реализация заданного компилятора и пояснительная записка, оформленная в соответствии с требованиями стандартов и задания на курсовую работу.
Для программной реализации компилятора рекомендуется использовать язык программирования C++ и систему программирования Visual Studio 2008 Express Edition . Возможно использовать другие системы программирования по согласованию с преподавателем. Компилятор должен содержать следующие составные части:
Для построения компилятора рекомендуется использовать методы, освоенные в ходе выполнения лабораторных работ по курсу «Системное программное обеспечение».
Порядок выполнения работы.
Рекомендуемый порядок выполнения работы представлен в табл. 1.
Таблица 1. Рекомендуемые этапы и время выполнения курсовой работы
№ |
Этап выполнения работы |
Время выполнения (недели) |
Результат |
1 |
Получение задания |
||
2 |
Выбор одной из трех форм грамматики, запись грамматики входного языка в выбранной форме грамматики |
1 |
Грамматика входного языка |
3 |
Разработка структуры лексического анализатора |
0,25 |
Описание лексического анализатора |
4 |
Разработка структуры данных и алгоритмов для таблицы идентификаторов |
0,25 |
Описание способа организации таблицы идентификаторов |
5 |
Построение лексического анализатора |
0,5 |
Граф переходов автомата лексического анализатора |
6 |
Программная реализация лексического анализатора |
2 |
Программный код лексического анализатора |
7 |
Выбор класса КС-грамматик для построения синтаксического анализатора |
0,5 |
Описание синтаксического анализатора |
8 |
Программная реализация синтаксического анализатора |
3,5 |
Программный код синтаксического анализатора |
9 |
Описание используемых форм внутреннего представления программы |
0,5 |
Описание форм внутреннего представления программы |
10 |
Описание используемого алгоритма оптимизации |
0,5 |
Алгоритм работы оптимизатора |
11 |
Программная реализация оптимизатора |
2 |
Программный код оптимизатора |
12 |
Реализация генератора результирующего кода |
2 |
Программный код генератора результирующего кода |
13 |
Отладка компилятора в целом |
1 |
Программный код разработанного компилятора |
14 |
Оформление пояснительной |
1,5 |
Пояснительная записка к курсовой работе |
15 |
Подготовка курсовой работы к защите |
0,5 |
|
16 |
Защита курсовой работы |
||
Итого |
16 |
Требования к содержанию пояснительной записки
Пояснительная записка к курсовой работе должна содержать следующие разделы:
Примеры входной и результирующей программ, а также текст программы компилятора рекомендуется оформлять в виде приложений к тексту пояснительной записке.
В качестве основы построения синтаксического
анализатора допускается
Допускается для построения лексического и (или) синтаксического анализаторов использовать автоматизированные методы построения распознавателей (например, на основе программ LEX и YACC). В этом случае не требуется приводить граф переходов конечного автомата (для лексического анализатора) и описание синтаксического анализатора.
В таком варианте соответствующие
разделы пояснительной записки
должны содержать следующую
Задание на курсовую работу
Компилятор должен запускаться
командной строкой с
Командная строка должна быть достаточной для функционирования компилятора. Помимо интерфейса командной строки возможно наличие дополнительного интерактивного интерфейса пользователя у компилятора (в том числе и графического) по усмотрению исполнителя работы.
Входной язык компилятора должен удовлетворять следующим требованиям:
граммы:
Приоритет операций исполнитель работы должен выбрать самостоятельно (приоритет операций учитывается в грамматике входного языка). Для изменения приоритета операций должны использоваться круглые скобки.
Полное описание входного языка должно быть задано в грамматике входного языка, которая строится исполнителем на первом этапе работы. Грамматика входного языка должна предусматривать любые входные цепочки, удовлетворяющие изложенным требованиям. Допускаются любые модификации входного языка по выбору исполнителя, если они не выходят за рамки указанных требований. Допускается расширять набор разрешенных операций и операторов входного языка при условии удовлетворения заданным минимальным требованиям, но при этом не разрешается использовать операции и операторы из других вариантов задания — все такие операторы обязательно должны трактоваться как ошибочные.
Компилятор должен проверять следующие
семантические ограничения
Всю неизменную часть результирующей программы компилятор должен порождать самостоятельно вне зависимости от поданной на вход исходной программы. Имя результирующей программы исполнитель выбирает самостоятельно. Идентификаторы InpVar и CompileTest являются предопределенными переменными, которые используются для подачи значений на вход результирующей программы и получения результата от нее при тестировании работоспособности результирующей программы. Тип данных, используемый для всех переменных, задается в варианте задания. Все встречающиеся в исходной программе идентификаторы следует считать простыми скалярными переменными, не требующими выполнения преобразования типов. Ограничения на длину идентификаторов и констант во входной программе исполнитель выбирает самостоятельно, но выбранная длина не должна быть меньше 32. В случае если на вход компилятора подается входная программа, содержащая семантические или синтаксические ошибки, компилятор должен корректно завершать свое выполнение и выдавать сообщение о найденной ошибке во входной программе с указанием строки, в которой найдена ошибка. По возможности компилятор должен указывать тип найденной ошибки. Компилятор может указать несколько ошибок во входной программе, если они были им обнаружены.
Варианты заданий
Предлагаемые варианты заданий приведены в табл. 2
Таблица 2.
Варианты заданий на выполнение курсовой работы
№ вари- анта |
Метод организации таблицы иденти- фикаторов |
Описание входного языка | |||||
Оператор цикла |
Условный оператор |
Тип операндов и констант |
Вид комментария |
Арифметические выражения |
Алгоритм оптимизации | ||
1. |
Простой список. |
do {...} while(...), разделенные символом ; (точка с запятой). |
if( ... ) ....else... разделенные символом ; (точка с запятой) |
float |
Комментарий в фигурных скобках: {...}. |
выражения, разделенные символом ; (точка с запятой). Состоят из идентификаторов, десятичных чисел с плавающей точкой (в обычной и логарифмической форме), знака присваивания (:=), знаков операций +, -, *, / , простых логических операций (<, >, =)и круглых скобок |
Исключение лишних операций. |
2. |
Рехэширо- вание с использо-ванием псеводо-случайных чисел |
while(...) {...} разделенные символом ; (точка с запятой). |
if( ... ) ....else.. разделенные символом ; (точка с запятой). |
integer |
Комментарий в круглых скобках со звездочкой: (*...*). |
логические выражения, разделенные символом; (точка с запятой), состоят из идентификаторов, констант true и false, знака присваивания (:=), знаков операций or, xor, and, not и круглых скобок. |
Свертка объектного кода. |
3. |
Рехэши- рование с помощью произведения |
for (...; ...;...) разделенные символом ; (точка с запятой). |
if... then ... else … if... then …, разделенные символом ; (точка с запятой) |
double |
Комментарий за двойной косой чертой до конца строки: //.... |
Операторы условия содержат идентификаторы, знаки сравнения <, >, =, десятичные числа с плавающей точкой (в обычной и логарифмической форме), знак присваивания (:=). |
Исключение лишних операций |
4. |
Метод цепочек |
for (...; ...;...) разделенные символом ; (точка с запятой). |
if( ... ) ....else.. разделенные символом ; (точка с запятой). |
float |
Комментарий внутри косых черт со звездочкой: /*...*/. |
Операторы цикла содержат идентификаторы, знаки сравнения<, >, =, десятичные числа с плавающей точкой (в обычной и логарифмической форме), знак присваивания (:=). |
Свертка объектного кода. |
5. |
Рехэширо- вание с использо-ванием псеводо-случайных чисел |
do {...} while(...), разделенные символом ; (точка с запятой). |
if... then ... else … if... then …, разделенные символом ; (точка с запятой) |
integer |
Комментарий в фигурных скобках: {...}. |
арифметические выражения, разделенные символом ; (точка с запятой). Состоят из идентификаторов, римских чисел, знака присваивания (:=), знаков операций +, -, *, / и круглых скобок. |
Исключение лишних операций |
6. |
Упорядо-ченный список |
while(...) {...} разделенные символом ; (точка с запятой). |
if( ... ) ....else.. разделенные символом ; (точка с запятой). |
char |
Комментарий в круглых скобках со звездочкой: (*...*). |
Логические выражения, разделенные символом; (точка с запятой). Логические выражения состоят из идентификаторов, констант 0 и 1, знака присваивания (:=), знаков операций or, xor, and, not и круглых скобок. |
Свертка объектного кода. |
7. |
Бинарное дерево |
while(...) {...} разделенные символом ; (точка с запятой). |
if... then ... else и if... then, разделенные символом ; (точка с запятой). |
integer |
Комментарий за двойной косой чертой до конца строки: //.... |
Операторы условия содержат идентификаторы, знаки сравнения <, >, =, римские числа, знак присваивания (:=).Знаков операций +, -, *, / и круглых скобок.
|
Исключение лишних операций |
8. |
Простое рехэши -рование |
for (...; ...; ...) do, разделенные символом ; (точка с запятой). |
if... then ... else и if... then, разделенные символом ; (точка с запятой). |
integer |
Комментарий внутри косых черт со звездочкой: /*...*/. |
Операторы цикла содержат идентификаторы, знаки сравнения <, >, =, римские числа, знак присваивания (:=),знаков операций +, -, *, / и круглых скобок.
|
Свертка объектного кода. |
9. |
Рехэширо- вание с использо-ванием псеводо-случайных чисел |
do {...} while(...), разделенные символом ; (точка с запятой). |
if( ... ) ....else.. разделенные символом ; (точка с запятой). |
integer |
Комментарий в круглых скобках со звездочкой: (*...*). |
арифметические выражения, разделенные символом ; (точка с запятой), состоят из идентификаторов, шестнадцатеричных чисел, знака присваивания (:=), знаков операций +, -, *, / и круглых скобок. |
Исключение лишних операций |
10. |
Рехэши- рование с помощью произведения |
do {...} while(...), разделенные символом ; (точка с запятой). |
if( ... ) ....else.. разделенные символом ; (точка с запятой). |
integer |
Комментарий за двойной косой чертой до конца строки: //.... |
логические выражения, разделенные символом; (точка с запятой), состоят из идентификаторов, шестнадцатеричных чисел, знака присваивания (:=), знаков операций or, xor, and, not и круглых скобок. |
Свертка объектного кода. |
11. |
Метод цепочек |
while(...) {...} разделенные символом ; (точка с запятой). |
if... then ... else и if... then, разделенные символом; (точка с запятой). |
integer |
Комментарий в круглых скобках со звездочкой: (*...*). |
Операторы условия содержат идентификаторы, знаки сравнения <, >, =, шестнадцатеричные числа, знак присваивания (:=), знаков операций +, -, *, / и круглых скобок.
|
Исключение лишних операций |
12. |
Простой список. |
for (...; ...; ...) do, разделенные символом ; (точка с запятой). |
if... then ... else и if... then, разделенные символом; (точка с запятой). |
integer |
Комментарий за двойной косой чертой до конца строки: //.... |
Операторы цикла содержат идентификаторы, знаки сравнения <, >, =, шестнадцатеричные числа, знак присваивания (:=),знаков операций +, -, *, / и круглых скобок.
|
Свертка объектного кода. |
13. |
Упорядо-ченный список |
do {...} while(...), разделенные символом ; (точка с запятой). |
if( ... ) ....else.. разделенные символом ; (точка с запятой). |
char |
Комментарий за двойной косой чертой до конца строки: //.... |
арифметические выражения, разделенные символом ; (точка с запятой), состоят из идентификаторов, символьных констант (один символ в одинарных кавычках), знака присваивания (:=), знаков операций +, -, *, / и круглых скобок. |
Свертка объектного кода. |
14. |
Бинарное дерево |
while(...) {...} разделенные символом ; (точка с запятой). |
if... then ... else и if... then, разделенные символом; (точка с запятой). |
char |
Комментарий внутри косых черт со звездочкой: /*...*/. |
логические выражения, разделенные символом; (точка с запятой), состоят из идентификаторов, символьных констант 'T' и 'F', знака присваивания (:=), знаков операций or, xor, and, not и круглых скобок. Арифметические операции включают знаки операций +, - и круглых скобок.
|
Свертка объектного кода. |
15. |
Рехэши- рование с помощью произведения |
for (...; ...;...) разделенные символом ; (точка с запятой). |
условия типа if... then ... else и if... then, разделенные символом; (точка с запятой). |
char |
Комментарий внутри косых черт со звездочкой: /*...*/. |
Операторы условия содержат идентификаторы, знаки сравнения <, >, =, строковые константы (последовательность символов в двойных кавычках), знак присваивания (:=). Арифметические операции включают знаки операций +, -и круглых скобок.
|
Исключение лишних операций |
16. |
Метод цепочек |
for (...; ...; ...) do, разделенные символом ; (точка с запятой) |
if( ... ) ....else.. разделенные символом ; (точка с запятой). |
char |
Комментарий в круглых скобках со звездочкой: (*...*). |
Операторы цикла содержат идентификаторы, знаки сравнения <, >, =, строковые константы (последовательность символов в двойных кавычках), знак присваивания (:=). Арифметические операции включают знаки операций +, -,и круглых скобок.
|
Исключение лишних операций |
17. |
Рехэширо- вание с использо-ванием псеводо-случайных чисел |
do {...} while(...), разделенные символом ; (точка с запятой). |
if( ... ) ....else... разделенные символом ; (точка с запятой) |
float |
Комментарий за двойной косой чертой до конца строки: //.... |
выражения, разделенные символом ; (точка с запятой). состоят из идентификаторов, десятичных чисел с плавающей точкой (в обычной и логарифмической форме), знака присваивания (:=), знаков операций +, - и круглых скобок |
Свертка объектного кода. |
18. |
Простое рехэши -рование |
while(...) {...} разделенные символом ; (точка с запятой). |
if( ... ) ....else.. разделенные символом ; (точка с запятой). |
integer, char |
Комментарий в круглых скобках со звездочкой: (*...*). |
логические выражения, разделенные символом; (точка с запятой), состоят из идентификаторов, констант true и false, знака присваивания (:=), знаков операций or, xor, and, not и круглых скобок. Арифметические операции включают знаки операций +, - и круглых скобок.
|
Исключение лишних операций. |
19. |
Рехэши- рование с помощью произведения |
for (...; ...;...) разделенные символом ; (точка с запятой). |
if( ... ) ....else.. разделенные символом ; (точка с запятой). |
double |
Комментарий в фигурных скобках: {...}. |
Операторы условия содержат идентификаторы, знаки сравнения <, >, =, десятичные числа с плавающей точкой (в обычной и логарифмической форме), знак присваивания (:=).Арифметические операции включают знаки операций +, -и круглых скобок.
|
Свертка объектного кода. |
20. |
Метод цепочек |
for (...; ...;...) разделенные символом ; (точка с запятой). |
if... then ... else … if... then …, разделенные символом ; (точка с запятой) |
float |
Комментарий в круглых скобках со звездочкой: (*...*). |
Операторы цикла содержат идентификаторы, знаки сравнения<, >, =, десятичные числа с плавающей точкой (в обычной и логарифмической форме), знак присваивания (:=). Арифметические операции включают знаки операций +, - и круглых скобок.
|
Исключение лишних операций |
21. |
Рехэши- рование с помощью произведения |
while(...) {...} разделенные символом ; (точка с запятой). |
if... then ... else … if... then …, разделенные символом ; (точка с запятой) |
integer |
Комментарий внутри косых черт со звездочкой: /*...*/. |
арифметические выражения, разделенные символом ; (точка с запятой). Состоят из идентификаторов, римских чисел, знака присваивания (:=), знаков операций +, -, *, / и круглых скобок. |
Исключение лишних операций |
22. |
Бинарное дерево |
for (...; ...; ...) do, разделенные символом ; (точка с запятой). |
if( ... ) ....else.. разделенные символом ; (точка с запятой). |
char |
Комментарий внутри косых черт со звездочкой: /*...*/. |
Логические выражения, разделенные символом; (точка с запятой). Логические выражения состоят из идентификаторов, констант 0 и 1, знака присваивания (:=), знаков операций or, xor, and, not и круглых скобок. Арифметические операции включают знаки операций +, - и круглых скобок.
|
Исключение лишних операций |
23. |
Упорядо-ченный список |
while(...) {...} разделенные символом ; (точка с запятой). |
if... then ... else и if... then, разделенные символом ; (точка с запятой). |
integer |
Комментарий в фигурных скобках: {...}. |
Операторы условия содержат идентификаторы, знаки сравнения <, >, =, римские числа, знак присваивания (:=).Арифметические операции включают знаки операций +, -, *, / и круглых скобок.
|
Свертка объектного кода. |
24. |
Метод цепочек |
for (...; ...; ...) do, разделенные символом ; (точка с запятой). |
if... then ... else и if... then, разделенные символом ; (точка с запятой). |
integer |
Комментарий в круглых скобках со звездочкой: (*...*). |
Операторы цикла содержат идентификаторы, знаки сравнения <, >, =, римские числа, знак присваивания (:=).Арифметические операции включают знаки операций +, - и круглых скобок.
|
Исключение лишних операций |
25. |
Рехэширо- вание с использо-ванием псеводо-случайных чисел |
while(...) {...} разделенные символом ; (точка с запятой). |
if... then ... else и if... then, разделенные символом; (точка с запятой). |
int |
Комментарий в круглых скобках со звездочкой: (*...*). |
арифметические выражения, разделенные символом ; (точка с запятой), состоят из идентификаторов, шестнадцатеричных чисел, знака присваивания (:=), знаков операций +, -, *, / и круглых скобок. |
Исключение лишних операций |
26. |
Рехэши- рование с помощью произведения |
do {...} while(...), разделенные символом ; (точка с запятой). |
if( ... ) ....else.. разделенные символом ; (точка с запятой). |
int |
Комментарий в фигурных скобках: {...}. |
логические выражения, разделенные символом; (точка с запятой), состоят из идентификаторов, шестнадцатеричных чисел, знака присваивания (:=), знаков операций or, xor, and, not и круглых скобок. Арифметические операции включают знаки операций +, - и круглых скобок.
|
Свертка объектного кода. |
27. |
Метод цепочек |
for (...; ...; ...) do, разделенные символом ; (точка с запятой). |
if... then ... else и if... then, разделенные символом; (точка с запятой). |
integer |
Комментарий за двойной косой чертой до конца строки: //.... |
Операторы условия содержат идентификаторы, знаки сравнения <, >, =, шестнадцатеричные числа, знак присваивания (:=).Арифметические операции включают знаки операций +, -, *, / и круглых скобок.
|
Свертка объектного кода. |
28. |
Простой список. |
do {...} while(...), разделенные символом ; (точка с запятой). |
if... then ... else и if... then, разделенные символом; (точка с запятой). |
int |
Комментарий за двойной косой чертой до конца строки: //.... |
Операторы цикла содержат идентификаторы, знаки сравнения <, >, =, шестнадцатеричные числа, знак присваивания (:=). Арифметические операции включают знаки операций +, - и круглых скобок.
|
Свертка объектного кода. |
29. |
Упорядо-ченный список |
for (...; ...; ...) do, разделенные символом ; (точка с запятой). |
if( ... ) ....else.. разделенные символом ; (точка с запятой). |
char |
Комментарий за двойной косой чертой до конца строки: //.... |
арифметические выражения, разделенные символом ; (точка с запятой), состоят из идентификаторов, символьных констант (один символ в одинарных кавычках), знака присваивания (:=), знаков операций +, -, ^(степень) и круглых скобок. |
Исключение лишних операций |
30. |
Бинарное дерево |
while(...) {...} разделенные символом ; (точка с запятой). |
if( ... ) ....else.. разделенные символом ; (точка с запятой). |
char |
Комментарий внутри косых черт со звездочкой: /*...*/. |
логические выражения, разделенные символом; (точка с запятой), состоят из идентификаторов, символьных констант 'T' и 'F', знака присваивания (:=), знаков операций or, xor, and, not и круглых скобок. Арифметические операции включают знаки операций +, - и круглых скобок.
|
Исключение лишних операций |
31. |
Рехэши- рование с помощью произведения |
do {...} while(...), разделенные символом ; (точка с запятой). |
if... then ... else и if... then, разделенные символом; (точка с запятой). |
char |
Комментарий внутри косых черт со звездочкой: /*...*/. |
Операторы условия содержат идентификаторы, знаки сравнения <, >, =, строковые константы (последовательность символов в двойных кавычках), знак присваивания (:=). Арифметические операции включают знаки операций +, - и круглых скобок.
|
Исключение лишних операций |
32. |
Метод цепочек |
for (...; ...; ...) do, разделенные символом ; (точка с запятой) |
if... then ... else и if... then, разделенные символом; (точка с запятой). |
char |
Комментарий в круглых скобках со звездочкой: (*...*). |
Операторы цикла содержат идентификаторы, знаки сравнения <, >, =, строковые константы (последовательность символов в двойных кавычках), знак присваивания (:=). Операции над строками + (конкатенация), обращение (~). Для оператора цикла используются операции, ++ (инкремент), -- (декремент).
|
Исключение лишних операций |
33. |
Метод цепочек |
do {...} while(...), разделенные символом ; (точка с запятой). |
if( ... ) ....else... разделенные символом ; (точка с запятой) |
double |
Комментарий в фигурных скобках: {...}. |
выражения, разделенные символом ; (точка с запятой). состоят из идентификаторов, десятичных чисел с плавающей точкой (в обычной и логарифмической форме), знака присваивания (:=), знаков операций +, -, *, / , ^ (степень) и круглых скобок |
Свертка объектного кода. . |
34. |
Рехэши- рование с помощью произведения |
while(...) {...} разделенные символом ; (точка с запятой). |
if( ... ) ....else.. разделенные символом ; (точка с запятой). |
int |
Комментарий в круглых скобках со звездочкой: (*...*). |
логические выражения, разделенные символом; (точка с запятой), состоят из идентификаторов, констант true и false, знака присваивания (:=), знаков операций or, xor, and, not и круглых скобок. |
Исключение лишних операций |
35. |
Упорядо-ченный список |
for (...; ...;...) разделенные символом ; (точка с запятой). |
if... then ... else … if... then …, разделенные символом ; (точка с запятой) |
float |
Комментарий за двойной косой чертой до конца строки: //.... |
Операторы условия содержат идентификаторы, знаки сравнения <, >, =, десятичные числа с плавающей точкой (в обычной и логарифмической форме), знак присваивания (:=).Для оператора цикла используются операции, ++ (инкремент), -- (декремент). |
Исключение лишних операций |
Информация о работе Создание компилятора с заданного подмножества языка