Разработка процессора p-ичной арифметики с функциями MINUS, ROUND, MIN, страница 3

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

Заключение

В процессе работы были получены навыки алгоритмизации и программной реализации всех основных блоков компилятора. Был изучен синтаксис и получен навык использования строковых переменных, структур, записей и других важных типов данных языка Си. Освоен метод рекурсии при решении различных задач. Получено представление о динамическом распределении памяти, указателях на различные объекты и освоена процедура взятия адреса. Были использованы такие важные элементы языка Си, как предпроцессорные утверждения. Были изучены способы задания порождающих правил языка и освоен метод разбора выражений путем преобразования в обратную польскую запись. Благодаря выполненной работе получены представления о принципах работы реально существующих компиляторов, что позволит избегать ошибок при написании программ.