Разработка процессора р-ичной арифметики с функциями OR INT MIN, страница 2

]

1.3 Интерфейс

Главная форма это текстовый редактор.

При нажатии вкладки «Файл» в главном меню мы можем создать новый документ, либо открыть, либо  сохранить документ.

Так же мы можем  выйти из программы, при этом если мы не сохраняли введенные изменения, то программа попросит нас сохранить документ.

Каждую операцию можем вызвать с помощью клавиатуры:

Создать- Ctrl+N;

Открыть- Ctrl+O;

Сохранить-Ctrl+S;

Сохранить как- Ctrl+A;

Выход- ALT+X;

Во вкладке «Редактирование» мы можем  вырезать или копировать часть документа, а так же вставить.

Каждую операцию можем делать с помощью клавиатуры:

            Вырезать- Ctrl+X;

            Копировать- Ctrl+C;

            Вставить- Ctrl+V;

Кнопка «Компилятор» отвечает за запуск компонентов и самого компилятора:

Лексический блок- F6

Синтаксический блок- F7

Генератор кода- F8

Запуск программы- F9

Кнопка «?»- F11 содержит справочный материал.

Форма№3  это Форма «Лексический блок» выводящая результат работы лексического блока.

Форма№4 это Форма «Синтаксический блок» выводящая результат работы синтаксического блока.

Форма№5 это Форма «Генератор кода» выводящая результат работы генератора кода.

2 Реализация компилятора

2.1 Реализация ЛБ

Функции, которые мы используем для реализации ЛБ

voidLex(char *s,intns); - возвращает в качестве параметра одну строку блокнота и ее номер и запускает функции, разделяющие и анализирующие лексемы.

char *NextLex(char *, char *); - возвращает в качестве параметров строку и перешагивает лексему, возвращает функция указатель на место в строке после проанализированной лексемы. Во второй параметр функция копирует выделенную и перейденную лексему. Фактически функция выделяет лексемы.

intIsDlm(char);- возвращает в качестве параметра символ и анализирует его на предмет того, является этот символ лексемой или нет.

int LexRecogn(char *s);- возвращает в качестве параметра строку и запускает функции, анализирующие выделенную лексему.

intTermRecogn (char *s);- возвращает в качестве параметра строку и анализирует ее на предмет служебного слова, возвращая в случае успеха код лексемы и 0 в случае неудачи.

intIdRecogn(char *str);- возвращает в качестве параметра строку и анализирует ее на предмет идентификатора, возвращая в случае успеха код идентификатора и 0 в случае неудачи.

intLitRecogn (char *);- возвращает в качестве параметра строку и анализирует ее на предмет константы, возвращая в случае успеха код константы и 0 в случае неудачи.

intDlmRecogn (char *);- возвращает в качестве параметра строку и анализирует ее на символ разделитель, возвращая в случае успеха код константы и 0 в случае неудачи.

2.2 Реализация СБ

Функции, которые мы используем для реализации СБ

int NextSymb(void);- возвращает следующий код, содержащийся в блокноте, если кончается строка, то функция увеличивает переменную, содержащую номер текущей строки, если в строке, содержащей необходимые коды, есть что-то, то функция вернет коды из этой строки.

voidSnt(void);- заключает в себе функции, анализирующие составляющие программы (заголовок, операторы описания, исполняемые операторы, конец программы).

voidTitle(void);-анализирует наличие заголовка, имени программы и точки с запятой после имени программы в программе.

voidDclOp(void);- анализирует оператор объявления.

voidList(void);-анализирует список идентификаторов в операторе объявления.

voidExeOp(void);- анализирует исполняемые операторы.

voidPBASE_Op(void);- анализирует оператор PBASE.

voidReadOp(void);- анализирует оператор ввода.

voidListIO (void);- анализирует список ввода/вывода.

voidWriteOp(void);-анализирует оператор вывода.

voidAsgnOp(void);- анализирует оператор присваивания.

voidEnd(void);- анализирует наличие конца в программе.

structtbl *FndIdCode(int);- ищет идентификатор по коду, переданному в качестве параметра, и возвращает структуру, содержащую искомый идентификатор.

structtbl *FndLit(int);-ищет константу по коду, переданному в качестве параметра, и возвращает структуру, содержащую искомую константу.

voidAlarm(void);-сдвигает разбор до первой встреченной точки с запятой.

voidExpr(void);- разбирает выражения.

voideitem2(void);-разбирает логическую операцию с AND.

voideitem(void); -разбирает операцию сравнения.

voidcompare(void); -разбирает операцию сложения или вычитания.

voidarithm2(void); -разбирает операцию сложения или вычитания.

voidarithm(void); -разбирает операцию умножения или деления.

voidfactor2(void); -разбирает операцию умножения или деления

voidpow(void);- -разбирает операцию возведения в степень

voidpow1(void);- -разбирает операцию возведения в степень

void factor(void); -разбирает операции, самого высокого приоритета(функции и выражения в скобках).

2.3 Реализация ГК

Функции, которые мы используем для реализации ГК

void StrGen(void);- анализирует полученный код и запускает генерацию, соответствующую данному коду.

voidTtlGen(void);- генерирует заголовок программы.

voidEndGen(void);- генерирует конец программы.

voidIntGen(char - генерирует объявление переменных типа Integer.

voidRealGen(char - генерирует объявление переменных типа Real.

voidAsgnGen(char *);- генерирует оператор присваивания.

voidReadGen(char *);-генерирует оператор ввода.

void WriteGen(char *);-генерирует оператор вывода.

void PBASE_Gen(char *);-генерирует оператор PBASE.

2.5 Реализация p-ичной библиотеки

intIntOp(char *);-проверяет операнд на принадлежность ко множеству целых чисел, в случае успеха функция возвращает единицу и ноль в обратном случае.

voidftop(float,char *);-переводит целое число в p-ичное.

floatptof(char *);-переводит р-чное число в вещественное.

voiditop(int,char *);- переводит целое число в р-чное.

intptoi(char *);-переводит р-чное число в целое.

voidpunmin(char *s);- реализует унарный минус.

voidpadd(char *, char *);- реализует сложение.

voidpsub(char *, char *);- реализует вычитание.

voidpmul(char *, char *);-реализует умножение.

voidpdiv(char *, char *);- реализует деление.

voidpmin(char *, char *);- находит минимум из двух чисел.

voidpdiv(char *, char *);- реализует деление.

voidppow(char *, char*);-реализует возведение в неотрицательную степень, представляемую вторым операндом, первого операнда.

voidpint(char *);- возвращает целую часть числа.

voidpeq(char *, char *);-реализует сравнение на равенство двух операндов.

voidpne(char *, char *);- реализует сравнение на неравенство  двух операндов.

voidplqe(char *, char *);- реализует сравнение « меньше или равно» двух операндов.

voidprqe(char *, char *); -реализует сравнение «больше или равно» двух операндов.

voidple(char *, char *); -реализует сравнение «меньше» двух операндов

voidpre(char *, char *);- реализует сравнение « больше» двух операндов

voidpnot(char *);- реализует логическое «НЕ».

void pand(char *, char *);- реализует логическое «И».

voidpor(char *, char *);- реализует логическое «ИЛИ».

voidppop(char *);-выводит из стека один операнд.

void ppush(char *);- вставляет в стек один операнд.

3 Тестирование и анализ

Покажем ошибки, которые может исправлять наша программа:

I)Лексический блок:

Текст программы:

PROGRAM;

INT a,b,uuuuuuuuuuuuuuuuuuuuuuuuuu;

REAL c;

PBASE(10);

READ(a,b);

d=OR(a,b);

c=Int(a)+MIN(a,b);

a=a*6+b+(1+b)/b;

WRITE(c);

WRITE(a);

END.

Результат работы:

II) Синтаксический блок

1)Текст прграммы:

PROGRAM;

INT a,b,b;

REAL c;

PBASE(10);

READ(a,b);

d=OR(a,b);

c=Int(a)+MIN(a,b);

a=a*6+b+(1+b)/b;

WRITE(c);

WRITE(a);

END.

Результат работы:

III) Генератор кода

Текст программы:

PROGRAM;

INT a,b,d;

REAL c;

PBASE(10);

READ(a,b);

d=OR(a,b);

c=Int(a)+MIN(a,b);

a=a*6+b+(1+b)/b;

WRITE(c);

WRITE(a);

END.

Проверим правильность подсчёта нашей программы:

1)Текст программы:

PROGRAM;

INT a,b,d;

REAL c;

PBASE(2);

READ(a,b);

d=OR(a,b);

c=Int(a)+MIN(a,b);

a=a*b+b+(1+b)/b;

WRITE(c);

WRITE(a);

END.

результат p-ичного блока при р равном 2:

c=1

a=1

2) Текст программы:

PROGRAM;

INT a,b,d;

REAL c;

PBASE(10);

READ(a,b);

d=OR(a,b);

c=Int(a)+MIN(a,b);

a=a*6+b+(1+b)/b;

WRITE(c);

WRITE(a);

END.

результат p-ичного блока при р равном 10:

c=10

a=61

Как мы видим программа работает нормально.

4 Заключение

В процессе изучения курса был создан компилятор p-ичной арифметики, реализующий трансляцию  программы, написанной согласно собственной грамматике, в язык С++. Компилятор реализует арифметику для систем счисления от 2-чной до 16-чной.