У нас: 141825 рефератів
Щойно додані Реферати Тор 100
Скористайтеся пошуком, наприклад Реферат        Грубий пошук Точний пошук
Вхід в абонемент





Інститут менеджменту та економіки “Галицька Академія”

КУРСОВИЙ ПРОЕКТ

з дисципліни СИСТЕМНЕ ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ

Тема – РОЗРОБКА КОМПІЛЯТОРА ДЛЯ СТВОРЕННЯ СПРОЩЕНИХ ПРОГРАМ З ВИВОДОМ ТЕКСТОВИХ ПОВІДОМЛЕНЬ ТА РОЗГАЛУЖЕННЯМИ НА ОСНОВІ УМОВНОГО ОПЕРАТОРА CASE.

ПОЯСНЮВАЛЬНА ЗАПИСКА

АНОТАЦІЯ

В даному проекті розроблений компілятор, який дозволяє створювати спрощені програми з виводом текстових повідомлень та розгалуженнями на основі умовного оператора CASE. Операції присвоєння та порівняння реалізовані для однобайтових констант та змінних. Окрім цього реалізовані функції вводу з клавіатури та виводу змінних на екран. Результатом роботи компілятора є *.exe файл.

SUMMARY

A compiler which allows to create simplified programs with showing of text messages and branching on the basis of conditional statement CASE is developed in this project. The operations of equation and comparison are realized for byte constants and variables. Except for it the functions of input from a keyboard and showing of variables on a screen are realized. The result of compilers work is *.exe file.

ЗМІСТ

Стор

1. БЛОК-СХЕМА ВИКОНАННЯ ПРОГРАМИ

2. ОПИС ПРОГРАМИ

3. ТЕКСТ ПРОГРАМИ

4. ТЕКСТ ПІДПРОГРАМ

5. ВИСНОВКИ

6. ПЕРЕЛІК ВИКОРИСТАНИХ ЛІТЕРАТУРНИХ ДЖЕРЕЛ

Зм. | Лист | № докум | Підпис | Дата

Розроб. | Літ. | Арк. | Аркушів

Перевір. | 5

Реценз.

Н.Контр.

Затверд.

1 БЛОК-СХЕМА ВИКОНАННЯ ПРОГРАМИ

Рис. 1. Блок-схема основної програми

Арк.

6

Зм. | Арк. | № докум | Підпис | Дата

Рис. 2. Блок-схема функції Scaner

 

Арк.

7

Зм. | Арк. | № докум | Підпис | Дата

2 ОПИС ПРОГРАМИ

Вхідний файл може включати змінні, що містять в імені (ім’я має довжину 31 символ) великі та малі букви англійського алфавіту (регістр символів не ігнорується), літерали (від -128 до 127). Окрім цього, є оператори вводу (cin>>змінна) та виводу (cout<<змінна) змінних, що задаються тільки малими буквами і не можуть бути використані, як назви змінних. Окрім цього є функція виводу текстових повідомлень cout<<”рядок”. Окремий рядок у вхідному файлі може мати одну з чотирьох форм:

A=B // Присвоєння змінній значення змінної

var=-64 // Ініціалізація змінної

cin>>a // Ввід значення змінної з клавіатури

cout<<F // Вивід значення змінної на екран

cout<<”рядок”// Вивід текстового рядка на екран

Оператор CASE дозволяють умовне виконання вищенаведених операторів. Процес формування об’єктного коду виконаний окремою функцією Scaner (Рис 2), що обробляє фрагменти програми, які знаходяться в фігурних дужках. В ці фрагменти можуть належати або не належати оператору CASE, а також включатися одне в одне (до 8 вкладень). При знаходженні символу ‘{’ виконується рекурсивний виклик функції Scaner, при знаходженні ’}’ – вихід.

Програма формує текст програми на мові Асемблер для процесора 8086 з арифметичним співпроцесором 8087. Співпроцесор використовується для двостороннього перетворення між двійковими та двійково-десятковими числами в операторах вводу/виводу змінних. Для цих перетворень резервується 10 байт в сегменті даних. Оператори вводу/виводу реалізовані викликом відповідної підпрограми. Текст цих підпрограм наведений в четвертому розділі пояснювальної записки.

Кодові взірці для усіх можливих конструкцій наведені в Табл. 1. Слід зауважити, що для присвоєння змінній значення числа формується не асемблерна команда, а директива <назва_змінної> DW <значення_змінної> в сегменті даних.

Арк.

8

Зм. | Арк. | № докум | Підпис | Дата

Таблиця 1

Конструкція

Об’єктний код

змінна1=змінна2

mov al, змінна2

mov word змінна1,al

cin>>змінна

lea bx, змінна

call cin

cout<<змінна

lea bx, змінна

call cout

cout<<”рядок”

lea dx,str<N>

mov ah,9

int 21h

switch(змінна){

case(значення)

{

оператори

}

}

mov al,змінна

cmp al,значення

jnz m<N>

команди

m<N>:

Усі дані в програмі представлені знаковими 8-розрядними числами в діапазоні від -128 до 127 (для роботи з 8087 використовуються слова в пам’яті). Літерали мають бути в цьому діапазоні.

Символи, що не відносяться до операторів (пробіли, переноси рядка, табуляція, тощо) ігноруються при аналізі.

Програма формує вихідний файл з текстом програми на мові Асемблер для компілятора Borland Turbo. Текст програми компілюється в *.exe файл шляхом виклику програм tasm.exe та tlink.exe через функцію system().

Нижче наведений шаблон для формування тексту програми:

.model small ; дані та код займають по одному сегменту

.stack 256 ; сегмент стеку розміром 256

.data ; початок сегменту даних

conv dt 0 ; 10 байт для роботи з 80387

<назва_змінної_1> DW <значення_змінної_1> ; ініціалізація змінних

;--------------------------------------------------------

<назва_змінної_N> DW <значення_змінної_N> ;

.code ; початок сегменту коду

main: mov ax,data ; ініціалізація сегменту

mov ds,ax ; даних

Арк.

9

Зм. | Арк. | № докум | Підпис | Дата

; текст основної програми

mov ah,1 ; виклик переривання DOS

int 21h ; для очікування натиснення

; кнопки на клавіатурі

mov ah,4Ch ; виклик переривання DOS

int 21h ; для завершення програми

; текст підпрограм вводу/виводу

end main ; кінець модуля

Роботу програми можна поділити на етапи. Спочатку програма ініціалізує змінні та текстові рядки в сегменті даних. Після цього виконується розбір програми та формування об’єктного коду. Це виконує функція Scaner. Після обробки тексту програми виконується запис тексту підпрограм вводу/виводу у вихідний файл. Після цього виконується компіляція програми за вищенаведеним методом.

Робота користувача з програмою виглядає наступним чином. Для запуску програми слід ввести її назву в командний рядок разом з параметром (шлях до вхідного файлу, що транслюється). Після роботи програми в директорії, в якій вона знаходиться, з’являться вихідний файл res.asm, виконавчий файл скомпільованої програми res.exe та допоміжні файли компілятора. Після цього залишається лише запустити res.exe.

Арк.

10

Зм. | Арк. | № докум | Підпис | Дата

3 ТЕКСТ ПРОГРАМИ

#include <stdio.h>

#include <string.h>

#include <conio.h>

#include <ctype.h>

#include <stdlib.h>

char in[512],id[30][32],var[32],STATE[8],op1[31],sw_var[31];

char d,found,new_entry,oper,k,v,l,BLOCKS,str_num,l_num;

int i,e,filesize,max_id;

FILE *fin,*fout;

void Scaner(void){

while(in[i]!='}'&&i!=filesize){

if(strncmp(in+i,"cin>>",5)==0){

i+=5;

for(e=0;in[i]!=';';i++,e++) var[e]=in[i];

var[e]=0;

fprintf(fout,"\tlea bx,%s \n\tcall cin \n",var);

i+=2;

continue;}

if(strncmp(in+i,"cout<<",6)==0){

i+=6;

if(in[i]=='"'){

fprintf(fout,"\tlea dx,str%i \n\tmov ah,9 \n\tint 21h \n",str_num++);

while(in[i]!=';') i++;}

else{

for(e=0;in[i]!=';';i++,e++) var[e]=in[i];

var[e]=0;

fprintf(fout,"\tlea bx,%s \n\tcall cout \n",var);

i+=2;

continue;}}

Арк.

11

Зм. | Арк. | № докум | Підпис | Дата

if(strncmp(in+i,"switch(",7)==0){

i+=7;

for(e=0;isalpha(in[i]);i++,e++) sw_var[e]=in[i];

sw_var[e]=0;

i++;}

if(strncmp(in+i,"case(",2)==0){

i+=5;

e=0;

if(in[i]=='-')


Сторінки: 1 2