Министерство образования и науки РФ
Новосибирский Государственный Технический Университет
Курсовой проект
«Процессор 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 Упрощенная структурная схема компилятора
Программа на исходном языке поступает на вход лексического блока в виде цепочки литер. Назначением лексического блока является преобразование этой цепочки в последовательность символов языка, при этом используются таблицы имен, в которых ищутся понятия языка и в которые заносятся понятия, вводимые программистом. В этом смысле лексическая обработка в какой-то мере эквивалентна группировке букв в слова и поиску этих слов в словаре.
Синтаксический блок переводит последовательность символов в другую, более непосредственно отражающую тот порядок, в котором должны выполняться операции в программе. Одновременно выполняется проверка предложений исходного языка на синтаксис в соответствии с правилами грамматики и окончательное заполнение таблиц имен.
Генератор кода преобразует синтаксически верную последовательность символов в последовательность команд для ЭВМ.
Работа компилятора может быть организована различными способами, да и сам он может содержать еще и другие блоки, например, семантический, оптимизации и т.д. В нашей работе мы использовали эту, так называемую, трехпроходную модель компилятора, в которой предполагаем, что каждый блок организован в виде отдельного прохода. Результаты каждого прохода записываются в свой файл, для файлов использованы следующие расширения:
.lex - результат работы лексического блока;
.snt - результат работы синтаксического блока;
.cpp - результат работы генератора кода.
Таким образом компилятор будет представлять собой программу, в которой последовательно выполняются следующие действия:
- открывается файл с текстом программы на исходном языке, читается его содержимое, из цепочек литер составляется цепочки символов, эти символы записываются в файл с расширением .lex, оба файла закрываются;
- открывается файл с цепочками символов, производится синтаксическая проверка этих цепочек в соответствии с порождающими правилами грамматики языка, выполняется реорганизация этих цепочек с точки зрения выполняемых ими функций, преобразованные цепочки символов записываются в файл с расширением .snt, оба файла закрываются;
- открывается файл с расширением .snt, описывающий по сути дела порядок выполняемых в программе действий, производится генерация, т.е. формирование и запись в выходной файл с расширением .cpp этих действий в виде последовательности команд на выходном языке компилятора, оба файла закрываются.
ГРАММАТИКА ЯЗЫКА (Вариант№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 – если при чтении выражения слева направо встречается конец выражения или подвыражения, то извлекаем знак из стека и печатаем его.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.