void ppop(char *) - операция извлечения операнда из стека.
void ppush(char *) – операция занесения операнда в стек.
int IntOp(char *s) – операция определения типа операнда.
float ptof(char *) -- преобразование вещественного p-ичного числа в 10-ичное
void ftop(float ,char *) -- преобразование вещественного числа из 10-ой системы в p-ичную
void itop(int , char *) -- преобразование целого числа из 10-ой системы в p-ичную
int ptoi(char *) -- преобразование целого p-ичного числа в 10-ичное
void padd(char *,char *) – операция сложения.
void pnot(char *) – операция отрицания.
void pdiv(char *,char *) – операция деления.
void pminus(char *, char *) – вычитание.
void pmul(char *,char *) – операция умножения.
void por(char *,char *) –операция логическое ИЛИ
void pand(char *,char *) –операция логического И.
void pround(char *) – округление.
void pmin(char *,char *) – минимальное значение.
void puminus(char *,char *) – унарный минус.
void pint(char *) – операция выделения целой части числа.
void pmt(char *, char *) - операция «больше»
void plt(char *, char *) - операция «меньше»
void pme(char *, char *) - операция «больше или равно»
void ple(char *, char *) - операция «меньше или равно»
void pne(char *, char *) - операция «неравно»
void peq(char *, char *) - операция «равно»
void ppow(char *, char *) - операция «возведение в степень»
Функции, используемые в головном модуле:
void TitleGen(void) – генерация заголовка;
void IntGen(char*s) – генерация оператора объявления переменных целого типа;
void RealGen(char*s) - генерация оператора объявления переменных вещественного типа;
void PBaseGen(char*s) – генерация основания системы счисления;
void ReadGen(char*s) – генерация оператора ввода переменных;
void WriteGen(char*s) – генерация оператора вывода переменных;
void EndGen(char*s) – генерация конца программы;
void AsgnGen(char*) – генерация выражения;
void StrGen(char*s) – генерация программы на языке C++.
2.4 Реализация p-ичной библиотеки
В библиотечном файле plib.h содержатся функции для реализации р-ичного блока.
Функции, содержащиеся в библиотеке plib.h:
void padd(char*,char*) – складывает значения первого и второго операндов, результат помещает в первый операнд (операция сложения).
void pminus(char*,char*) – вычитает из первого числа второе и результат помещает в первое(операция вычитания).
void puminus(char *,char *) – унарный минус.
void pmin(char*, char*) – возвращает минимальное значение.
void pmul(char*,char*) – перемножает значения первого и второго операндов, результат помещает в первый операнд (операция умножения).
void pdiv(char*,char*) – делит значение первого операнда на значение второго операнда, результат помещает в первый операнд (операция деления).
void peq(char*,char*) – выполняет операцию «равно».
void plt(char*,char*) – выполняет операцию «меньше».
void pgt(char*,char*) – выполняет операцию «больше».
void ple(char*,char*) – выполняет операцию «меньше или равно».
void pge(char*,char*) – выполняет операцию «больше или равно».
void pne(char*,char*) – выполняет операцию «не равно».
void pand(char*,char*) – выполняет операцию логического «И».
void por(char*,char*) – выполняет операцию логического «ИЛИ».
void pnot(char*) – выполняет операцию логического «НЕТ».
void pround(char*) – возвращает число, округленное до ближайшего значения.
void ppow(char*,char*) – выполняет операцию возведения в степень.
void ppush(char*) – выполняет занесение операнда в стек.
void ppop(char*) – выполняет извлечение операнда из стека.
int ptoi(char*) – преобразует содержимое строки в целое число.
float ptof(char*) – преобразует содержимое строки в вещественное число.
void itop(int,char*) – преобразует целое число в p-ичную строку.
void ftop(float,char*) – преобразует вещественное число в p-ичную строку.
int IntOp(char*) – возвращает 1, если содержимое строки представляет собой целое число, и 0 – если вещественное.
3. Тестирование компилятора
Правильный тест (текст файла test.inp)
Title
Start
Int: b,l,i;
Real: a,c,s,u,y;
PBase(10);
Read (b,c,y);
a=b*c;
u=c**b;
l=Minus(3,1);
i=Min(3,2);
s=Round(u);
Write(u,l,i,s);
End
Результат тестирования: последовательное создание файлов test.lex, test.snt, test.cpp, причем количество ошибок = 0
Содержимое файла test.lex:
01 00
02 00
04 26 31 28 32 28 33 27 00
05 26 34 28 35 28 36 28 37 28 38 27 00
12 29 60 30 27 00
13 29 31 28 35 28 38 30 27 00
34 24 31 17 35 27 00
37 24 35 16 31 27 00
32 24 10 29 61 28 62 30 27 00
33 24 11 29 61 28 63 30 27 00
36 24 09 29 37 30 27 00
14 29 37 28 32 28 33 28 36 30 27 00
03 00
Содержимое файла test.snt:
01 00
02 00
04 26 31 28 32 28 33 27 00
05 26 34 28 35 28 36 28 37 28 38 27 00
12 29 60 30 27 00
13 29 31 28 35 28 38 30 27 00
34 24 31 35 17 27 00
37 24 35 31 16 27 00
32 24 61 62 10 27 00
33 24 61 63 11 27 00
36 24 37 09 27 00
14 29 37 28 32 28 33 28 36 30 27 00
03 00
Содержимое файла test.cpp:
#include "plib.h"
void main(void){
char b[16],l[16],i[16];
char a[16],c[16],s[16],u[16],y[16];
p=10;
printf("Vvedite b=");gets(b);
printf("Vvedite c=");gets(c);
printf("Vvedite y=");gets(y);
ppush(b);
ppush(c);
ppop(op2);
ppop(op1);
pmul(op1,op2);
ppush(op1);
ppop(op1);
ftop(ptof(op1),op1);
strcpy(a,op1);
ppush(c);
ppush(b);
ppop(op2);
ppop(op1);
ppow(op1,op2);
ppush(op1);
ppop(op1);
ftop(ptof(op1),op1);
strcpy(u,op1);
ppush("3");
ppush("1");
ppop(op2);
ppop(op1);
pminus(op1,op2);
ppush(op1);
ppop(op1);
itop(ptoi(op1),op1);
strcpy(l,op1);
ppush("3");
ppush("2");
ppop(op2);
ppop(op1);
pmin(op1,op2);
ppush(op1);
ppop(op1);
itop(ptoi(op1),op1);
strcpy(i,op1);
ppush(u);
ppop(op1);
pround(op1);
ppush(op1);
ppop(op1);
ftop(ptof(op1),op1);
strcpy(s,op1);
printf("u=%s",u);
printf("l=%s",l);
printf("i=%s",i);
printf("s=%s",s);
getch();
}
Программа в файле test.cpp компилируется и запускается на выполнение.
Набор тестов для проверки работы компилятора:
Работа программы |
Ручной перевод |
|
b=Round(a); а=9.345, b=9 |
b=9 |
|
P=2; c=Min(100,101); c=101 |
c=101 |
|
p=16 ; b=3*a; a=5; b=F |
b=F |
|
p=16; d=Minus(a,b)*6; a=C; b=A; |
d=2 |
|
b=a**2-2*3-5; a=8;b=51 |
b=51 |
|
i=Minus(b,c);s=b+2/10;b=10;c=2 |
i=8;s=10.2 |
В процессе работы были получены навыки алгоритмизации и программной реализации всех основных блоков компилятора. Был изучен синтаксис и получен навык использования строковых переменных, структур, записей и других важных типов данных языка Си. Освоен метод рекурсии при решении различных задач. Получено представление о динамическом распределении памяти, указателях на различные объекты и освоена процедура взятия адреса. Были использованы такие важные элементы языка Си, как предпроцессорные утверждения. Были изучены способы задания порождающих правил языка и освоен метод разбора выражений путем преобразования в обратную польскую запись. Благодаря выполненной работе получены представления о принципах работы реально существующих компиляторов, что позволит избегать ошибок при написании программ.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.