- •Расчетно-графическая работа
- •Оглавление
- •Введение
- •Проектирование компилятора
- •Общие сведения
- •Грамматика языка
- •Разработка интерфейса
- •Реализация компилятора
- •2.1. Реализация лексического блока
- •2.2. Реализация синтаксического блока
- •2.3. Реализация генератора кода
- •2.4. Реализация р-ичной библиотеки
- •Тестирование и анализ результатов
- •Заключение
- •Список использованной литературы
2.3. Реализация генератора кода
Процесс работы компилятора можно представить двумя стадиями: синтеза и анализа. Действия лексического и синтаксического блоков относятся к анализу. Генерация кода – это синтез.
Основной задачей ГК является преобразование исходного текста программы в машинный код.
-
voidGenerateCode(char *s) –генерирует код по строке на выходе синтаксического блока;
-
voidGenerateHeader(void) –генерирует заголовок программы на заданном языке;
-
voidGenerateInteger(char *s) – генерирует код для объявления и инициализации переменных (списка) типа INTEGER;
-
voidGenerateReal (char *s) – генерирует код для объявления и инициализации переменных (списка) типа REAL;
-
voidGenerateBaseOperator(char *s) – генерирует код для установки основания системы счисления;
-
void GenerateReadOperator(char *s) – генерирует код для оператора ввода;
-
voidGenerateWriteOperator(char *s) – генерирует код для оператора вывода;
-
voidGenerateAssignOperator(char *str) – генерирует код для всех операций над переменными и вызовов функций;
-
voidGenerateEndOperator(void) –генерирует код для окончания программы.
2.4. Реализация р-ичной библиотеки
P-ичная библиотека реализована с помощью следующих функций:
-
intintOp(char *s) – проверяет, является ли строка целой;
-
void pumin(char *s) – унарныйминус;
-
voidpadd(char *, char *) – операция сложение;
-
voidpsub(char *, char *) – операция вычитание;
-
void pmul(char *, char *) – умножение;
-
void pdiv(char *, char *) – деление;
-
voidppow(char *, char *) – возведение в степень;
-
voidpeq(char *, char *) – операция «равно»;
-
voidpneq(char *, char *) – операция «не равно»;
-
voidplt(char *, char *) – операция «меньше»;
-
voidpgt(char *, char *) – операция «больше»;
-
voidpmin(char *, char *) – находит минимум из двух чисел;
-
voidple(char *, char *) – операция «меньше либо равно»;
-
voidpge(char *, char *) – операция «больше либо равно»;
-
voidpnot(char *) – операция «не»;
-
void pand(char *, char *) – операция «и»;
-
voidpor(char *, char *) – операция «или»;
-
floatptof(char *s) – перевод из р-ичной строки в вещественную;
-
voiditop(intf, char *s) – перевод из целого числа в р-ичную строку;
-
intptoi(char *s) – перевод из р-ичной строки в целую;
-
voidppush(char *s) – занесение операнда в стэк;
-
voidppop(char *s) – извлечение операнда из стэка;
-
voidftop(floatf, char *s) – перевод из вещественного числа в p-ичную строку.
Также в библиотеку были добавлены следующие функции:
-
voidpceil (char *s) – функция округления в большую сторону;
-
voidpfloor (char *s) – функция округления в меньшую сторону.
-
Тестирование и анализ результатов
Вид компилятора представлен на рис. 2.
Рис.2 – Текстовый редактор
Тесты лексического блока cошибками и без ошибокпредставлены на рис. 3.
Рис.3 – Лексический блок
Тест синтаксического блока с ошибками и без ошибок представлен на рис.4.
Рис.4 –Синтаксический блок
Тесты генератора кода по данным таблицы 2 отображены на рис. 5-9. После их выполнения можно сказать, что компилятор работает правильно, так как полученные результаты совпадают с результатами ручной калькуляции.
Рис.5 –Генератор кода
Рис.6 – Тест 1
Таблица 2 – Анализ работы компилятора
Имя теста |
Выражение |
Исходные данные |
Система счисления |
Результат подсчета |
Результат компилятора |
basic2.inp |
b = CEIL(c); d = FLOOR(c); e = a>= b; f = POW(b, 10); g = (10000/a)*(111+h); |
a = 10 h = 101 c =101.111
|
2 |
b = 110 d = 101 e = 0 f = 100100 g = 1100000 |
b = 110 d = 101 e = 0 f = 100100 g = 1100000 |
basic3.inp |
b = CEIL(c); d = FLOOR(c); e = a<= b; f = POW(b, 3); g = (52/a)*(301+h); |
a = 17 h = 23 c = 43.56 |
8 |
b = 44 d = 43 e = 1 f = 133100 g = 1121.46314 |
b = 44 d = 43 e = 1 f = 133100 g = 1121.46314 |
basic4.inp |
b = CEIL(c); d = FLOOR(c); e = a= b; f = POW(b, 4); g = (98.7/a)*(36+h); |
a = 9 h = 28 c = 8.981 |
10 |
b = 9 d = 8 e = 1 f = 6561 g ≈701.866771 |
b = 9 d = 8 e = 1 f = 6561 g ≈701.86677 |
basic5.inp |
b = CEIL(c); d = FLOOR(c); e = a<> b; f = POW(b, 2); g = (09F.B/a)*(0EE+h); |
a = 0A4 h = 0B2 c = 0D.A5f |
16 |
b = E d = D e = 1 f = C4 g = 195.0F9C |
b = E d = D e = 1 f = C4 g = 195.0F9C |
Рис.7 – Тест 2
Рис.8 – Тест 3
Рис.9 – Тест 4