Министерство высшего и профессионального образования Российской Федерации
Новосибирский государственный технический университет
Кафедра программных систем и баз данных
Курсовой проект
по дисциплине "Лингвистическое обеспечение информационных систем"
"Процессор р-ичной арифметики"
Факультет: |
бизнеса |
Группа: |
|
Выполнили: |
|
Руководитель: |
|
Оценка: |
Новосибирск
2006
Оглавление
Введение. 2
1. Проектирование компилятора. 2
1.1. Общие сведения. 2
1.2. Грамматика языка. 3
1.3. Интерфейс. 5
2. Реализация компилятора. 6
2.1. Общие сведения. 6
2.2. Реализация лексического блока. 6
2.3. Реализация синтаксического блока. 6
2.4. Реализация генератора кодов. 7
2.5. Реализация p-ичной библиотеки. 7
3. Тестирование и анализ. 8
Заключение. 11
Целью данного курсового проекта является разработка процессора р-ичной арифметики. В процессе выполнения курсового проекта необходимо разработать грамматику языка и реализовать для нее лексический, синтаксический блоки и генератор кода на языке программирования Си++. Реализуемый процессор все операции выполняет над данными, представленными строками p-ичных символов. Необходимо использовать формы представления чисел в виде целого и вещественного. Основание системы счисления p может быть задано от 2 до 16, его значение в разрабатываемом языке определяет функция PBASE. В выражении используются скобки.
Вариант 3
Операции |
Функции |
Операторы |
+ - * / ** = > >= < <= <> AND OR NOT |
DIV ABS ROUND PBASE |
Присваивания READ WRITE |
Работа компилятора состоит в том, чтобы перевести наборы символов, представляющих программу, написанную на некотором исходном языке программирования, в последовательность машинных команд, выполняющих то, что задумал программист. Взаимодействие основных блоков компилятора представлено ниже.
Рис 1.1.Упрощенная структурная схема компилятора
Программа на исходном языке поступает на вход лексического блока в виде цепочки литер. Назначением лексического блока является преобразование этой цепочки в последовательность символов языка, при этом используются таблицы имен, в которых ищутся понятия языка и в которые заносятся понятия, вводимые программистом. В этом смысле лексическая обработка в какой-то мере эквивалентна группировке букв в слова и поиску этих слов в словаре.
Синтаксический блок переводит последовательность символов в другую, более непосредственно отражающую тот порядок, в котором должны выполняться операции в программе. Одновременно выполняется проверка предложений исходного языка на синтаксис в соответствии с правилами грамматики и окончательное заполнение таблиц имен.
Генератор кода преобразует синтаксически верную последовательность символов в последовательность команд для ЭВМ.
Работа компилятора может быть организована различными способами, да и сам он может содержать еще и другие блоки, например, семантический, оптимизации и т.д. В нашей работе мы использовали эту, так называемую, трехпроходную модель компилятора, в которой предполагаем, что каждый блок организован в виде отдельного прохода. Результаты каждого прохода записываются в свой файл, для файлов использованы следующие расширения:
.txt - текст программы на входном языке;
.lex - результат работы лексического блока;
.snt - результат работы синтаксического блока;
.cpp - результат работы генератора кода.
Таким образом компилятор будет представлять собой программу, в которой последовательно выполняются следующие действия:
- открывается файл с текстом программы на исходном языке, читается его содержимое, из цепочек литер составляется цепочки символов, эти символы записываются в файл с расширением .lex, оба файла закрываются;
- открывается файл с цепочками символов, производится синтаксическая проверка этих цепочек в соответствии с порождающими правилами грамматики языка, выполняется реорганизация этих цепочек с точки зрения выполняемых ими функций, преобразованные цепочки символов записываются в файл с расширением .snt, оба файла закрываются;
- открывается файл с расширением .snt, описывающий по сути дела порядок выполняемых в программе действий, производится генерация, т.е. формирование и запись в выходной файл с расширением .gen этих действий в виде последовательности команд на выходном языке компилятора, оба файла закрываются.
<программа> -> <заголовок><тело программы>
<заголовок> -> HEAD <идентификатор>;
<тело программы> -> DECLARE <описание> START<выполняемые операторы> FIN
<описание> -> INT <список>; | INT <список>; <описание> | REAL <список> |
REAL <список>; <описание>
<список> -> <идентификатор> | <идентификатор>, <список>
<идентификатор> -> <буква> | <буква> <последовательность букв и цифр>
<последовательность букв и цифр> -> <буква> | <буква> < последовательность букв и цифр> | <цифра> | <цифра> < последовательность букв и цифр >
<буква>-> a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|
<цифра> -> 1| 2| 3| 4| 5| 6| 7| 8| 9| 0|
<выполняемые операторы> -> <оператор присваивания> | <оператор присваивания> <выполняемые операторы> | <READ> | <READ> <выполняемые операторы> | <WRITE> | <WRITE> <выполняемые операторы> | <функция>; | <функция>; <выполняемые операторы>
<оператор присваивания> -> <идентификатор> = <выражение>;
<константа> -> <целая константа> | <вещественная константа>
<вещественная константа> -> <последовательность р-ичных цифр>.
<последовательность р-ичных цифр>
<целая константа>-><последовательность р-ичных цифр>
<последовательность р-ичных цифр> -> < р-ичная цифра ><последовательность р-ичных цифр> | <р-ичная цифра >
<р-ичная цифра> -> <цифра> | A | B | C | D | E | F
<выражение>-><PBASE>(<основание системы счисления>)
<основание системы счисления>-> 2|3|4|5|6|7|8|9|10|11|12|13|14|15|16
<выражение> -><litem> | {G2} <litem2> | <litem>
<litem2>-><litem> {G3} | {G2} <litem2> | <litem> {G3}
<litem> -> <lfactor> & {G2} <lfactor2> |<lfactor>
<lfactor2> -> <lfactor>{G3} & {G2} <lfactor2> | <lfactor> {G3}
<lfactor> -> <arithm> < {G2} <arithm> {G3} |<arithm> > {G2} <arithm> {G3} |<arithm> <= {G2} <arithm> {G3} |<arithm> >= {G2} <arithm> {G3} |<arithm> <> {G2} <arithm> {G3} |<arithm> = {G2} <arithm> {G3} | <arithm>
<arithm> -> <item> + {G2} <item2> | <item> + {G2} <item2> | <item>
<item2> -><item>{G3} + {G2} <item2> | <item>{G3} + {G2} <item2> | <item>{G3}
<item>-> -> <factor> *{G2}<factor2>| <factor> *{G2}<factor2>| <factor>
<factor2> -> <factor> {G3}*{G2}<factor2>| <factor> {G3}/{G2}<factor2>| <factor> {G3}
<factor> -> <prim>**{G2}<factor> {G3}| - {G2}<factor>{G3}|!{G2} <factor> {G3} | <prim>
<prim> -> (<выражение>) | <функция> {G2} (<выражение> ) {G3} <константа> {G1}|<идентификатор>{G1}
<список вывода> -> "<текст>"| "<текст>", <список вывода> |<выражение> | <выражение>,<список вывода>
<текст>-><слово> | <слово> <текст>
<слово>-><знак> | <знак> <последовательность знаков>
<последовательность знаков>-><знак> | <знак><последовательность знаков>
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.