Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
19
Добавлен:
02.01.2020
Размер:
851.2 Кб
Скачать

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) – функция округления в меньшую сторону.

  1. Тестирование и анализ результатов

Вид компилятора представлен на рис. 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