Разработка процессора р-ичной арифметики с функциями OR INT MIN

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

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

Министерство образования и науки РФ

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

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

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

вариант№8

Факультет:       Бизнеса

Группа:            

Выполнил:       .

Проверил:         Поздняков Борис Сергеевич

Новосибирск

2005

Содержание

Введение. 2

1 Проектирование компилятора. 3

1.1 Общие сведения. 3

1.2 Грамматика. 4

1.3 Интерфейс. 6

2 Реализация компилятора. 6

2.2 Реализация ЛБ. 6

2.3 Реализация СБ. 7

2.4 Реализация ГК.. 8

2.5 Реализация p-ичной библиотеки. 8

3 Тестирование и анализ. 9

4 Заключение. 12

Введение

Целью курсового проекта является разработка процессора р-ичной арифметики. В процессе выполнения курсового проекта необходимо разработать грамматику языка и реализовать для нее лексический, синтаксический блоки и генератор кода на языке программирования Си++. Реализуемый процессор все операции  выполняет над данными, представленными строками p-ичных символов. Во всех вариантах используются формы представления чисел в виде целого и вещественного. Основание системы счисления p может быть задано от 2 до 16, его значение в разрабатываемом языке определяет функция или оператор PBASE. В выражении используются скобки.

Вариант 8

N

п/п

Операции

Функции

1

+  -  *  /   **   >  >=  <  <=  <> AND NOT

OR INT MIN

1 Проектирование компилятора

1.1 Общие сведения

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

 


Таблицы

 
                                                   

 


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

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

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

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

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

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

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

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

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

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

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

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

1.2 Грамматика

ГРАММАТИКА ЯЗЫКА (Вариант№8)

<программа> -> Prorgram<оператор объявления><выполняемые операторы>End.

<идентификатор> -> <буква>|<буква><последовательность букв и цифр>

<последовательность букв и цифр> -> <буква>|<буква><последовательность букв и цифр>|<цифра>|<цифра><последовательность букв и цифр>

<оператор объявления> -> Int <список>;|Int <список>;<оператор объявления>|REAL <список>;| REAL <список >;<оператор объявления>

<список> -> <идентификатор>|<идентификатор>,<список>

<выполняемые операторы> -> <оператор write>|<оператор write><выполняемые операторы>|<оператор присваивания>|<оператор присваивания><выполняемые операторы>|<оператор PBASE>|<оператор PBASE><выполняемые операторы>|< оператор READ >|<оператор READ><выполняемые операторы>

<оператор WRITE> -> WRITE (<список ввода/вывода>);

<оператор READ > -> READ (<список ввода/вывода>);

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

<оператор присваивания> -> <идентификатор>=<выражение>;

<выражение> -> <eitem>AND{G2}<eitem2>|<eitem>

<eitem2> -> <eitem>{G3}AND{G2}<eitem2>|<eitem>{G3}

<eitem> -> <compare>={G2}<compare>{G3}|<compare>>{G2}<compare>{G3}|<compare>>={G2}<compare>{G3}|<compare><{G2}<compare>{G3}|<compare><={G2}<compare>{G3}|<compare><>{G2}<compare>{G3}|<compare>{G3}

<compare> -> <arithm>+{G2}<arithm2>|<arithm>-{G2}<arithm2>| <arithm>

<arithm2> -> <arithm>{G3}+{G2}<arithm2>|<arithm>{G3}+{G2} <arithm2>|<arithm>{G3}

<arithm> -> <pow>*{G2}<factor2>|<pow>/{G2}<factor2> |<pow>

<factor2> -> <pow>{G3}*{G2}<factor2>|<pow>{G3}/{G2} <factor2>| <pow>{G3}

<pow> -> <factor>**{G2}<pow1>|<factor>

<pow1> -> <factor>{G3}**{G2}<pow1>|<pow1>

<factor> -> -{G2}<factor>{G3}|NOT{G2}<factor>{G3}|(<выражение>)|OR{G2}(<список выражений>){G3}|MIN{G2} (<список выражений>){G3} Int{G2}(<выражение>)|<идентификатор>|<константа>{G1}

<список выражений> -> <выражение>|<выражение>

<константа> -> <целое>|<дробное>

<целое> -> <цифра>|<цифра><последовательность цифр>|#<шестнадцатеричная цифра>|#< последовательность шестнадцатеричных цифр >

<последовательность цифр> -> <цифра>|<цифра><последовательность цифр>|#<шестнадцатеричная цифра>|#< последовательность шестнадцатеричных цифр >

< последовательность шестнадцатеричных цифр >#<шестнадцатеричная цифра>|#< последовательность шестнадцатеричных цифр >

<шестнадцатеричная цифра>->A|B|C|D|E|F

<дробное> -> <целое>.<дробная часть>

<дробное> -> <цифра>|<цифра><последовательность цифр>|#<шестнадцатеричная цифра>|#< последовательность шестнадцатеричных цифр >

<оператор PBASE> -> PBASE(<основание системы счисления>);

<основание системы счисления> -> 2|3|4|5|6|7|8|9|10|11|12|13|14|15|16

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

G1 – если при чтении выражения слева направо встречается операнд (идентификатор или константа), то печатаем его.

G2 – если при чтении выражения слева направо встречается знак операции, то он заносится в стек.

G3 – если при чтении выражения слева направо встречается конец выражения или подвыражения, то извлекаем знак из стека и печатаем его.

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

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