Разработка процессора р-ичной арифметики с функциями DIV ABS ROUND PBASE

Страницы работы

Содержание работы

Министерство высшего и профессионального образования Российской Федерации

Новосибирский государственный технический университет

Кафедра программных систем и баз данных

Курсовой проект

по дисциплине "Лингвистическое обеспечение информационных систем"

"Процессор р-ичной арифметики"

Факультет:

бизнеса

Группа:

Выполнили:

Руководитель:

Оценка:

Новосибирск

 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.1. Общие сведения

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

 


Рис 1.1.Упрощенная структурная схема компилятора

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

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

Генератор кода преобразует синтаксически верную последовательность символов в последовательность команд для ЭВМ.

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

.txt - текст программы на входном языке;

.lex - результат работы лексического блока;

.snt - результат работы синтаксического блока;

.cpp - результат работы генератора кода.

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

- открывается файл с текстом программы на исходном языке, читается его содержимое, из цепочек литер составляется цепочки символов, эти символы записываются в файл с расширением .lex, оба файла закрываются;

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

- открывается файл с расширением .snt, описывающий по сути дела порядок выполняемых в программе действий, производится генерация, т.е. формирование и запись в выходной файл с расширением .gen этих действий в виде последовательности команд на выходном языке компилятора, оба файла закрываются.

1.2. Грамматика языка

<программа> -> <заголовок><тело программы>

<заголовок> -> 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}

<список вывода> -> "<текст>"| "<текст>", <список вывода> |<выражение> | <выражение>,<список вывода>

<текст>-><слово> | <слово> <текст>

<слово>-><знак> | <знак> <последовательность знаков>

<последовательность знаков>-><знак> | <знак><последовательность знаков>

Похожие материалы

Информация о работе