- •Введение
- •1. Проектирование компилятора
- •1.1 Общие сведения
- •1.2 Грамматика
- •1.3 Интерфейс программы
- •2. Реализация компилятора
- •2.1 Реализация Лексического Блока
- •2.2 Реализация Сиснтаксического Блока
- •2.3 Реализация Генератора Кода
- •2.4 Реализация p-ичной библиотеки
- •Тестирование
- •Лексический блок:
- •2) Синтаксический блок
- •3) Генератор кода
- •Заключение
2.3 Реализация Генератора Кода
Функции, используемые для реализации Генератора кода
void StrGen(char *) – анализирует полученный код и запускает генерацию, соответствующую данному коду.
void TtlGen(void) – генерирует заголовок программы.
void IntGen(char*) – генерирует объявление переменных типа Integer.
void RealGen(char*) – генерирует объявление переменных типа Real.
void PBASE_Gen(char *) – генерирует оператор PBASE.
void ReadGen(char *) – генерирует оператор ввода.
void WriteGen(char *) – генерирует оператор вывода.
void AsgnGen(char *) – генерирует оператор присваивания.
void EndGen(void) – генерирует конец программы.
2.4 Реализация p-ичной библиотеки
Функции, используемые для реализации р-ичной билиотеки
int ptoi(char *) – переводит р-чное число в целое.
float ptof(char *) – переводит р-чное число в вещественное.
void itop(int,char *) – переводит целое число в р-чное.
void ftop(float,char *) – переводит целое число в p-ичное.
int IntOp(char *) – проверяет операнд на принадлежность ко множеству целых чисел, в случае успеха функция возвращает единицу и ноль в обратном случае.
void ppop(char *) – выводит из стека один операнд.
void ppush(char *) – вставляет в стек один операнд.
void padd(char *, char *) – реализует сложение.
void pnot(char *) – реализует логическое «НЕ».
void por(char *, char *) – реализует логическое «ИЛИ».
void pand(char *, char *) – реализует логическое «И».
void psub(char *, char *) – реализует вычитание.
void pmul(char *, char *) – реализует умножение.
void pmax(char *, char *) – возвращает наибольшее число из двух.
void pabs(char *, char*) – возвращает модуль числа.
void ple(char *, char *) – реализует сравнение «меньше» двух операндов
void pre(char *, char *) – реализует сравнение «больше» двух операндов
void pleq(char *, char *) – реализует сравнение «меньше или равно» двух операндов.
void preq(char *, char *) – реализует сравнение «больше или равно» двух операндов.
void pneq(char *, char *) – реализует сравнение на неравенство двух операндов.
void peq(char *, char *) – реализует сравнение на равенство двух операндов.
void pumin(char *s) – реализует унарный минус.
Тестирование
Ошибки, которые может исправлять программа:
-
Лексический блок:
Текст программы:
PROGRAM;
INT a,b,c,fб;
REAL e;
PBASE(16);
READ(a,c);
b=MAX(a,b)+ABS(a);
f=AND(a,b);
WRITE(b);
END.
Результат работы:
2) Синтаксический блок
1)Текст прграммы:
PROGRAM;
INT a,b,c,f;
REAL e;
PBASE(16);
READ(a,c);
b=MAX(a,b)+ABS(a);
f=AND(a,b)
WRITE(b);
END.
Результат работы:
3) Генератор кода
Текст программы:
PROGRAM;
INT a,b,c,f;
REAL e;
PBASE(10);
READ(a,b);
c=MAX(a,b)+ABS(a);
f=AND(a,b)+5;
WRITE(c);
END.
Заключение
В процессе разработки процессора были получены навыки программирования на языке C++. Произошло ознакомление с принципами написания компилятора, состоящего из 3-х блоков (лексического, синтаксического и генератора кода) и р-ичной библиотеки.