Министерство образования Российской Федерации
Новосибирский Государственный Технический Университет
Курсовой проект по
лингвистическому обеспечению информационных систем
«Процессор р-ичной арифметики»
Вариант № 12
Факультет: Бизнеса
Группа: ФБИ-51
Выполнил: Лоншаков С. А.
Проверил: Поздняков Б.С.
Новосибирск
2006
Оглавление
Введение…………………………………………………………………………...3
1. Проектирование компилятора…………………………………………………3
1.1 Общие положения…………………………………………………………3
1.2 Грамматика языка………………………………………………………….4
1.3 Разработка интерфейса компилятора…………………………………….5
2. Реализация компилятора……………………………………………………....7
2.1 Реализация лексического блока………………………………………….7
2.2 Реализация синтаксического блока………………………………………8
2.3 Реализация генератора кода………………………………………………9
2.4 Реализация p-ичной библиотеки………………………………………...10
3. Тестирование компилятора…………………………………………………..11
Заключение……………………………………………………………………….14
Введение
Целью данного курсового проекта является закрепление навыков в области разработки программного обеспечения. Тема курсового проекта: «Процессор p-ичной арифметики». Для создания процессора p-ичной арифметики необходимо разработать грамматику языка и реализовать для нее лексический, синтаксический блоки и генератор кода на языке Си ++ Builder 6.0.
Реализуемый процессор все операции выполняет над данными, представленными строками p-ичных символов. В разрабатываемом языке должны быть операторы ввода (READ), вывода (WRITE) и присваивания. Число может представляться в целом и вещественном виде, а для записи выражений могут использоваться скобки. Основание системы счисления p может быть задано от 2 до 16, его значение, в разрабатываемом языке определяет оператор задания основания системы счисления PBASE.
В соответствии с вариантом курсового проекта № 12, процессор p-ичной арифметики должен выполнять:
– арифметические операции, такие как сложение (+), умножение (*), деление (/), возведение в степень (**) ;
– операции отношения: больше (>), больше или равно (>=), меньше (<), меньше или равно (<=), не равно (<>), равно (=);
– логические операции, такие как, логическое «и» (AND), логическое «или» (OR) и логическое «нет» (NOT);
– функции: MINUS (вычитание двух операндов), ROUND (округляет число до ближайшего целого), MIN (находит минимальное значение из двух).
1. Проектирование компилятора
1.1 Общие положения
Программа, которая принимает на входе программу на исходном языке, а на выходе выдает другую версию этой программы на объектном языке, называется транслятором. Объектный язык обычно является машинным языком конкретной ЭВМ. Существует условное деление трансляторов на ассемблеры (для языков низкого уровня) и компиляторы (для языков высокого уровня).
Работа компилятора состоит в том, чтобы перевести наборы символов, представляющих программу, написанную на некотором исходном языке программирования, в последовательность машинных команд, выполняющих то, что задумал программист. Взаимодействие основных блоков компилятора представлено на рис. 1.1.
Рис.1.1 Упрощенная структурная схема компилятора
Программа на исходном языке поступает на вход лексического блока в виде цепочки литер. Назначением лексического блока является преобразование этой цепочки в последовательность символов языка, при этом используются таблицы имен, в которых ищутся понятия языка и в которые заносятся понятия, вводимые программистом. В этом смысле лексическая обработка в какой-то мере эквивалентна группировке букв в слова и поиску этих слов в словаре.
Синтаксический блок переводит последовательность символов в другую, более непосредственно отражающую тот порядок, в котором должны выполняться операции в программе. Одновременно выполняется проверка предложений исходного языка на синтаксис в соответствии с правилами грамматики и окончательное заполнение таблиц имен.
Генератор кода преобразует синтаксически верную последовательность символов в последовательность команд для ЭВМ.
Результат работы лексического блока записывается в файл, с расширением .lex, синтаксического блока, в файл с расширением .snt, а результат работы генератора кода содержится в файле, с расширением .cpp.
Таким образом компилятор представляет собой программу, в которой последовательно выполняются следующие действия:
- открывается файл с текстом программы на исходном языке, читается его содержимое, из цепочек литер составляется цепочки символов, эти символы записываются в файл с расширением .lex, оба файла закрываются;
- открывается файл с цепочками символов, производится синтаксическая проверка этих цепочек в соответствии с порождающими правилами грамматики языка, выполняется реорганизация этих цепочек с точки зрения выполняемых ими функций, преобразованные цепочки символов записываются в файл с расширением .snt, оба файла закрываются;
- открывается файл с расширением .snt, описывающий по сути дела порядок выполняемых в программе действий, производится генерация, т.е. формирование и запись в выходной файл с расширением .cpp этих действий в виде последовательности команд на выходном языке компилятора, оба файла закрываются.
- запускается консольное приложение.
1.2 Грамматика языка
<программа> -><заголовок><тело>
<заголовок>-> Title|Title<идентификатор>
<идентификатор> -> <буква>|<буква><последовательность букв и цифр><последовательность букв и цифр> -> <буква>|<буква><последовательность букв и цифр>|<цифра>|<цифра><последовательность букв и цифр>
<буква>-> 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|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
<тело> –><начало><оператор объявления><выполняемый оператор><конец>
<начало>–>Start
<оператор объявления>->Int <список>;|Int <список>;<оператор объявления>|Real<список>|Real<список>;<оператор объявления>
<список> -><идентификатор>|<идентификатор>,<список>
<выполняемые операторы> ->
<оператор Write>|<оператор Write><выполняемые операторы>|
<оператор присваивания>|<оператор присваивания><выполняемые операторы>|
<оператор PBase>|<оператор PBase><выполняемые операторы>|
<оператор Read>|<оператор Read><выполняемые операторы
<оператор Write> -> Write(<список ввода/вывода>);
<список ввода/вывода> -> <идентификатор>|<идентификатор>,<список ввода/вывода>
<оператор PBase> –> PBase (<основание>);
<оператор Read>->Read(<список ввода/вывода>);
<оператор присваивания> -> <идентификатор>=<выражение>;
<выражение>–><litem>OR{G2}<litem2>|<litem>
<litem2>–><litem>{G3}OR{G2}<litem2>|<litem>{G3}
<litem>–><lfactor>AND{G2}<lfactor2>|<lfactor>
<lfactor2>–><lfactor>{G3}AND{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>
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.