- •Расчетно-графическая работа
- •Оглавление
- •Введение
- •Проектирование компилятора
- •Общие сведения
- •Грамматика языка
- •Разработка интерфейса
- •Реализация компилятора
- •2.1. Реализация лексического блока
- •2.2. Реализация синтаксического блока
- •2.3. Реализация генератора кода
- •2.4. Реализация р-ичной библиотеки
- •Тестирование
- •Заключение
- •Список использованной литературы
2.3. Реализация генератора кода
Процесс работы компилятора можно представить двумя стадиями: синтеза и анализа. Все о чем мы ранее говорили, ЛБ и СБ, это и есть анализ. А вот генерация кода – это синтез.
Основной задачей ГК является преобразование исходного текста программы в машинный код.
-
void StrGen(char *s) – разбор целого текста.
-
void TtlGen(void) – разбор начала программы.
-
void DclGen(char *s) – разбор оператора INTEGER и REAL.
-
void PbaseGen(char *s) – разбор оператора PBASE.
-
void ReadGen(char *s) – разбор оператора READ.
-
void WriteGen(char *s) – разбор оператора WRITE.
-
void AsgnGen(char *str) – генерация выражений.
-
void EndGen(void) – разбор окончания программы.
2.4. Реализация р-ичной библиотеки
P-ичная библиотека реализована с помощью следующих функций:
-
int intOp(char *s) – проверяет, является ли строка целой;
-
void pumin(char *s) – унарный минус;
-
void padd(char *, char *) – операция сложение;
-
void psub(char *, char *) – операция вычитание;
-
void pint(char *) – целая часть числа;
-
void pmul(char *, char *) – умножение;
-
void pdiv(char *, char *) – деление;
-
void ppow(char *, char *) – возведение в степень;
-
void peq(char *, char *) – операция «равно»;
-
void pneq(char *, char *) – операция «не равно»;
-
void plt(char *, char *) – операция «меньше»;
-
void pgt(char *, char *) – операция «больше»;
-
void pmin(char *, char *) – находит минимум из двух чисел;
-
void ple(char *, char *) – операция «меньше либо равно»;
-
void pge(char *, char *) – операция «больше либо равно»;
-
void pnot(char *) – операция «не»;
-
void pand(char *, char *) – операция «и»;
-
void por(char *, char *) – операция «или»;
-
float ptof(char *s) – перевод из р-ичной строки в вещественную;
-
void itop(int f, char *s) – перевод из целого числа в р-ичную строку;
-
int ptoi(char *s) – перевод из р-ичной строки в целую;
-
void ppush(char *s) – занесение операнда в стэк;
-
void ppop(char *s) – извлечение операнда из стэка;
-
void ftop(float f, char *s) – перевод из вещественного числа в p-ичную строку;
-
pabs(char *) – нахождение модуля числа.
-
Тестирование
Вид компилятора на рис. 2.
Рис.2 – Текстовый редактор
Тест лексического блока без ошибок и с ошибкой на рис. 3.
Рис.3 – Лексический блок
Тест синтаксического блока отображен на рис.4.
Рис.4 – Синтаксический блок
Тест генератора кода отображен на рис.5.
Рис.5 – Генератор кода
Заключение
В процессе работы были закреплены навыки в разработке программного обеспечения, были реализованы лексический, синтаксический блоки, а также генератор кода и р-ичная библиотека.
Список использованной литературы
-
Либерти, Джесс. Освой самостоятельно C++ за 21 день. – М.: Вильямс, 2001. – 816 c.
-
Липпман, С. Основы программирования на C++. – М.: Вильямс, 2002. – 256 c.
-
Секунов, Н.Ю. Самоучитель Visual C++ 6.0. – СПб: BHV, 2004. – 960 c.
-
Алексанкин В. Начинаем работать в Borland C++ Builder/ Алексанкин В., Елманова Н.// Компьютер-Пресс – 1997 – N 4.
-
Вахтеров М. Четвертый BORLAND С++ и его окружение/ Вахтеров М., Орлов С., 1994 г.