Разработка компилятора

Автор работы: Пользователь скрыл имя, 12 Декабря 2012 в 01:25, курсовая работа

Краткое описание

Наименование программного продукта – «Компилятор».
Область применения программного продукта – разработка программного обеспечения, трансляция с языка высокого уровня на язык ассемблера.
Разработка предназначена для компиляции программы из исходного кода в код на языке ассемблера.

Содержание работы

1 ТЕХНИЧЕСКОЕ ЗАДАНИЕ. 4
2 ОПИСАНИЕ ПРОГРАММЫ. 7
3 ТЕКСТ ПРОГРАММЫ. 17
4 КОНТРОЛЬНЫЙ ПРИМЕР ИСПОЛЬЗОВАНИЯ 47
ЗАКЛЮЧЕНИЕ 64

Содержимое работы - 1 файл

Курсовая СПО.docx

— 223.50 Кб (Скачать файл)

      if (analiz[current_analiz].nomer=11) and (analiz[current_analiz].table='k') then op_while;

      if (analiz[current_analiz].nomer=5) and (analiz[current_analiz].table='k') then op_read;

      if (analiz[current_analiz].nomer=4) and (analiz[current_analiz].table='k') then op_write;

      if (analiz[current_analiz].nomer=10) and (analiz[current_analiz].table='k') then op_do;

       end;

    if analiz[current_analiz+1].table<>'s' then error(3);

    cur_stroka:=cur_stroka+1;

    end;

   

  begin

    current_analiz:=current_analiz+1;

    If not ((analiz[current_analiz].table='k') and (tab_I[analiz[current_analiz].nomer]='begin')) then error(9);

    While not((analiz[current_analiz+1].table='k') and (tab_I[analiz[current_analiz+1].nomer]='end')) do

      begin

      operator;

      //cur_stroka:=cur_stroka+1;

      current_analiz:=current_analiz+1;

      If not ((analiz[current_analiz].table='s') and (tab_razdel[analiz[current_analiz].nomer]=';')) then error(3);

      end;

    current_analiz:=current_analiz+1;

    If not((analiz[current_analiz].table='k') and (tab_I[analiz[current_analiz].nomer]='end')) then error(4);

  end;

 

  procedure mass;

  begin

  current_analiz:=current_analiz+1;

  if not ((analiz[current_analiz].table='s') and (tab_razdel[analiz[current_analiz].nomer]='[')) then error(22);

  current_analiz:=current_analiz+1;

  if not (analiz[current_analiz].table='c') then  error(23);

  ch1_mas:=strtoint(tab_cifri[analiz[current_analiz].nomer]);

  current_analiz:=current_analiz+1;

  if not ((analiz[current_analiz].table='h') and (tab_hardrazdel[analiz[current_analiz].nomer]='..')) then error(24);

  current_analiz:=current_analiz+1;

  if not (analiz[current_analiz].table='c') then error(23);

  ch2_mas:=strtoint(tab_cifri[analiz[current_analiz].nomer]);

  current_analiz:=current_analiz+1;

  if not ((analiz[current_analiz].table='s') and (tab_razdel[analiz[current_analiz].nomer]=']')) then error(12);

  current_analiz:=current_analiz+1;

  if not ((analiz[current_analiz].table='k') and (tab_I[analiz[current_analiz].nomer]='of')) then error(25);

  current_analiz:=current_analiz+1;

  case analiz[current_analiz].nomer of

  16:inc(i);

  17:inc(i);

  18:inc(i);

  19:inc(i);

Else writeln ('<код9>');

 End;

End;

 

begin

pr; //sintax

end;

 

begin

count_razdel:=1;

count_liter:=1;

count_cifri:=1;

count_ident:=1;

k:=1;

Assign(f2,'keys.txt');

Reset(f2);

assign(f3,'razdel.txt');

Reset(f3);

assign(f4,'peobraz.txt');

rewrite(f4);

assign(f6,'cod.asm');

rewrite(f6);

assign(f7,'dat.txt');

rewrite(f7);

razdel:=[':','[',']','<','>','=','(',')',',',':','.',';','-','+','/','*','!'];

alfavit:=['A'..'Z','a'..'z','_'];

cifri:=['0'..'9'];

Assign(f1,'primer.txt'); {124124124124,12412414}

Reset(f1);

leksich;

dlina:=0;

i:=0;

sintax;

Writeln('good');

close(f1);

close(f2);

close(f3);

close(f4);

close(f6);

close(f7);

end.

 

 

 

 

 

4 КОНТРОЛЬНЫЙ ПРИМЕР ИСПОЛЬЗОВАНИЯ.

Произведем  контрольный пример использования.

Program primer1; //ыфвфыв

var a,y,temp,yan:integer;

    b,c:integer;

    p:boolean;

    sim:char;

    i:byte;  

    ar:array [1..10] of integer;   

begin

p:=true; //koment

sim:='h';

write('vvedite a: ');

read(a);

write('vvedite b: ');

read(b);

write('vvedite c: ');

read(c);

{big

coment}

If ( !a>b! ) and ( !a>c! ) then a:=b+c; else a:=25;

If ( !a>b! ) or ( !b>c! ) then a:=c; else a:=b;

write('a=',a,'b=',b,'c=',c);

write(p);

write(sim);

ar[3]:=10;

while !ar[3]>1+1! do

ar[3]:=ar[3]-3;

write('ar[3] ',ar[3]);

ar[2]:=10;

do

write(ar[2]);

ar[2]:=ar[2]-1;

loop while !ar[2]>=2!;

a,b,c:=5;

write('a=',a,'b=',b,'c=',c);

If not(!a-3+(2*1)<>b-1!) then write('end not');

end.

 

Произведем  запуск компилятора. Покажем сгенерированный  код ассемблера.

.model tiny

.Code

org 100h

 

Start:

MOV AX,1

PUSH AX

POP AX

mov p, al

MOV sim,'h'

MOV SI,0

MOV DX,0

MOV DX,'v'

MOV BUFS[SI],DL

INC SI

MOV DX,'v'

MOV BUFS[SI],DL

INC SI

MOV DX,'e'

MOV BUFS[SI],DL

INC SI

MOV DX,'d'

MOV BUFS[SI],DL

INC SI

MOV DX,'i'

MOV BUFS[SI],DL

INC SI

MOV DX,'t'

MOV BUFS[SI],DL

INC SI

MOV DX,'e'

MOV BUFS[SI],DL

INC SI

MOV DX,' '

MOV BUFS[SI],DL

INC SI

MOV DX,'a'

MOV BUFS[SI],DL

INC SI

MOV DX,':'

MOV BUFS[SI],DL

INC SI

MOV DX,' '

MOV BUFS[SI],DL

INC SI

MOV DX,'$'

MOV BUFS[SI],DL

INC SI

MOV DX,offset BUFS

MOV AH,09h

INT 21h

CALL R_Ch

CALL R_Int

MOV a, AX

CALL outline

MOV SI,0

MOV DX,0

MOV DX,'v'

MOV BUFS[SI],DL

INC SI

MOV DX,'v'

MOV BUFS[SI],DL

INC SI

MOV DX,'e'

MOV BUFS[SI],DL

INC SI

MOV DX,'d'

MOV BUFS[SI],DL

INC SI

MOV DX,'i'

MOV BUFS[SI],DL

INC SI

MOV DX,'t'

MOV BUFS[SI],DL

INC SI

MOV DX,'e'

MOV BUFS[SI],DL

INC SI

MOV DX,' '

MOV BUFS[SI],DL

INC SI

MOV DX,'b'

MOV BUFS[SI],DL

INC SI

MOV DX,':'

MOV BUFS[SI],DL

INC SI

MOV DX,' '

MOV BUFS[SI],DL

INC SI

MOV DX,'$'

MOV BUFS[SI],DL

INC SI

MOV DX,offset BUFS

MOV AH,09h

INT 21h

CALL R_Ch

CALL R_Int

MOV b, AX

CALL outline

MOV SI,0

MOV DX,0

MOV DX,'v'

MOV BUFS[SI],DL

INC SI

MOV DX,'v'

MOV BUFS[SI],DL

INC SI

MOV DX,'e'

MOV BUFS[SI],DL

INC SI

MOV DX,'d'

MOV BUFS[SI],DL

INC SI

MOV DX,'i'

MOV BUFS[SI],DL

INC SI

MOV DX,'t'

MOV BUFS[SI],DL

INC SI

MOV DX,'e'

MOV BUFS[SI],DL

INC SI

MOV DX,' '

MOV BUFS[SI],DL

INC SI

MOV DX,'c'

MOV BUFS[SI],DL

INC SI

MOV DX,':'

MOV BUFS[SI],DL

INC SI

MOV DX,' '

MOV BUFS[SI],DL

INC SI

MOV DX,'$'

MOV BUFS[SI],DL

INC SI

MOV DX,offset BUFS

MOV AH,09h

INT 21h

CALL R_Ch

CALL R_Int

MOV c, AX

CALL outline

mov ax,a

push ax

mov ax,b

push ax

POP BX

POP AX

CMP AX,BX

JG MET1

PUSH 0

JMP MET2

MET1:

PUSH 1

MET2:

mov ax,a

push ax

mov ax,c

push ax

POP BX

POP AX

CMP AX,BX

JG MET3

PUSH 0

JMP MET4

MET3:

PUSH 1

MET4:

POP AX

POP BX

AND AX,BX

PUSH AX

POP AX

CMP AX,0

JZ MET5

mov ax,b

push ax

mov ax,c

push ax

pop bx

pop ax

add ax,bx

push ax

POP CX

mov a, CX

JMP MET6

MET5:

mov ax,25

push ax

POP CX

mov a, CX

MET6:

mov ax,a

push ax

mov ax,b

push ax

POP BX

POP AX

CMP AX,BX

JG MET7

PUSH 0

JMP MET8

MET7:

PUSH 1

MET8:

mov ax,b

push ax

mov ax,c

push ax

POP BX

POP AX

CMP AX,BX

JG MET9

PUSH 0

JMP MET10

MET9:

PUSH 1

MET10:

POP AX

POP BX

OR AX,BX

PUSH AX

POP AX

CMP AX,0

JZ MET11

mov ax,c

push ax

POP CX

mov a, CX

JMP MET12

MET11:

mov ax,b

push ax

POP CX

mov a, CX

MET12:

MOV SI,0

MOV DX,0

MOV DX,'a'

MOV BUFS[SI],DL

INC SI

MOV DX,'='

MOV BUFS[SI],DL

INC SI

MOV DX,'$'

MOV BUFS[SI],DL

INC SI

MOV DX,offset BUFS

MOV AH,09h

INT 21h

mov ax,a

push ax

CALL PR_Int

mov dx,32

mov ah,2h

int 21h

MOV SI,0

MOV DX,0

MOV DX,'b'

MOV BUFS[SI],DL

INC SI

MOV DX,'='

MOV BUFS[SI],DL

INC SI

MOV DX,'$'

MOV BUFS[SI],DL

INC SI

MOV DX,offset BUFS

MOV AH,09h

INT 21h

mov ax,b

push ax

CALL PR_Int

mov dx,32

mov ah,2h

int 21h

MOV SI,0

MOV DX,0

MOV DX,'c'

MOV BUFS[SI],DL

INC SI

MOV DX,'='

MOV BUFS[SI],DL

INC SI

MOV DX,'$'

MOV BUFS[SI],DL

INC SI

MOV DX,offset BUFS

MOV AH,09h

INT 21h

mov ax,c

push ax

CALL PR_Int

CALL outline

mov al,p

push ax

CALL output_logic

CALL outline

mov al,sim

push ax

push dx

mov dx,offset sim

mov ah,9h

int 21h

pop dx

CALL outline

mov ax,3

push ax

mov ax,10

push ax

POP CX

POP BX

MOV AX,2

MUL BX

MOV SI,AX

MOV ar[SI],CX

MET13:

mov ax,3

push ax

POP BX

MOV AX,2

MUL BX

MOV SI,AX

MOV AX, ar[SI]

PUSH AX

mov ax,1

push ax

mov ax,1

push ax

pop bx

pop ax

add ax,bx

push ax

POP BX

POP AX

CMP AX,BX

JG MET14

PUSH 0

JMP MET15

MET14:

PUSH 1

MET15:

POP AX

CMP AX,1

JNZ MET16

mov ax,3

push ax

mov ax,3

push ax

POP BX

MOV AX,2

MUL BX

MOV SI,AX

MOV AX, ar[SI]

PUSH AX

mov ax,3

push ax

pop bx

pop ax

sub ax,bx

push ax

POP CX

POP BX

MOV AX,2

MUL BX

MOV SI,AX

MOV ar[SI],CX

POP AX

JMP MET13

MET16:

MOV SI,0

MOV DX,0

MOV DX,'a'

MOV BUFS[SI],DL

INC SI

MOV DX,'r'

MOV BUFS[SI],DL

INC SI

MOV DX,'['

MOV BUFS[SI],DL

INC SI

MOV DX,'3'

MOV BUFS[SI],DL

INC SI

MOV DX,']'

MOV BUFS[SI],DL

INC SI

MOV DX,' '

MOV BUFS[SI],DL

INC SI

MOV DX,'$'

MOV BUFS[SI],DL

INC SI

MOV DX,offset BUFS

MOV AH,09h

INT 21h

mov ax,3

push ax

POP BX

MOV AX,2

MUL BX

MOV SI,AX

MOV AX, ar[SI]

PUSH AX

CALL PR_Int

CALL outline

mov ax,2

push ax

mov ax,10

push ax

POP CX

POP BX

MOV AX,2

MUL BX

MOV SI,AX

MOV ar[SI],CX

MET17:

mov ax,2

push ax

POP BX

MOV AX,2

MUL BX

MOV SI,AX

MOV AX, ar[SI]

PUSH AX

CALL PR_Int

CALL outline

mov ax,2

push ax

mov ax,2

push ax

POP BX

MOV AX,2

MUL BX

MOV SI,AX

MOV AX, ar[SI]

PUSH AX

mov ax,1

push ax

pop bx

pop ax

sub ax,bx

push ax

POP CX

POP BX

MOV AX,2

MUL BX

MOV SI,AX

MOV ar[SI],CX

mov ax,2

push ax

POP BX

MOV AX,2

MUL BX

MOV SI,AX

MOV AX, ar[SI]

PUSH AX

mov ax,2

push ax

POP BX

POP AX

CMP AX,BX

JGE MET18

PUSH 0

JMP MET19

MET18:

PUSH 1

MET19:

POP AX

CMP AX,1

JNZ MET20

JMP MET17

MET20:

mov ax,5

push ax

POP CX

mov c, CX

mov b, CX

mov a, CX

MOV SI,0

MOV DX,0

MOV DX,'a'

MOV BUFS[SI],DL

INC SI

MOV DX,'='

MOV BUFS[SI],DL

INC SI

MOV DX,'$'

MOV BUFS[SI],DL

INC SI

MOV DX,offset BUFS

MOV AH,09h

INT 21h

mov ax,a

push ax

CALL PR_Int

mov dx,32

mov ah,2h

int 21h

MOV SI,0

MOV DX,0

MOV DX,'b'

MOV BUFS[SI],DL

INC SI

MOV DX,'='

MOV BUFS[SI],DL

INC SI

MOV DX,'$'

MOV BUFS[SI],DL

INC SI

MOV DX,offset BUFS

MOV AH,09h

INT 21h

mov ax,b

push ax

CALL PR_Int

mov dx,32

mov ah,2h

int 21h

MOV SI,0

MOV DX,0

MOV DX,'c'

MOV BUFS[SI],DL

INC SI

MOV DX,'='

MOV BUFS[SI],DL

INC SI

MOV DX,'$'

MOV BUFS[SI],DL

INC SI

MOV DX,offset BUFS

MOV AH,09h

INT 21h

mov ax,c

push ax

CALL PR_Int

CALL outline

mov ax,a

push ax

mov ax,3

push ax

pop bx

pop ax

sub ax,bx

push ax

mov ax,2

push ax

mov ax,1

push ax

pop bx

pop ax

mul bx

push ax

pop bx

pop ax

add ax,bx

push ax

mov ax,b

push ax

mov ax,1

push ax

pop bx

pop ax

sub ax,bx

push ax

POP BX

POP AX

CMP AX,BX

JNE MET21

PUSH 0

JMP MET22

MET21:

PUSH 1

MET22:

POP AX

NOT AX

PUSH AX

POP AX

CMP AX,0

JZ MET23

MOV SI,0

MOV DX,0

MOV DX,'e'

MOV BUFS[SI],DL

INC SI

MOV DX,'n'

MOV BUFS[SI],DL

INC SI

MOV DX,'d'

MOV BUFS[SI],DL

INC SI

MOV DX,' '

MOV BUFS[SI],DL

INC SI

MOV DX,'n'

MOV BUFS[SI],DL

INC SI

MOV DX,'o'

MOV BUFS[SI],DL

INC SI

MOV DX,'t'

MOV BUFS[SI],DL

INC SI

MOV DX,'$'

MOV BUFS[SI],DL

INC SI

MOV DX,offset BUFS

MOV AH,09h

INT 21h

JMP MET24

MET23:

MET24:

 

EndKode:

mov ax, 4Ch

int 21h

 

.Data

    a   DW(?)

    y   DW(?)

 temp   DW(?)

  yan   DW(?)

    b   DW(?)

    c   DW(?)

    p   DB(?)

  sim   DB(?)

    i   DB(?)

   ar   DW  9  DUP(?)

  BUF   DW  5  DUP(?)

bufs1   DW ?

bufs2   DW ?

bufs3   DW ?

BUFS   DB 50  DUP(?)

$logic_true   db 'true $'

$logic_false   db 'false $'

 

R_B proc near

CMP BUFS,'t'

JNZ FN

PUSH 1 ; TRUE

JMP PBEnd

FN: CMP BUFS, 'f'

JNZ EndKode1

EndKode1:

JMP EndKode

PUSH 0

PBEnd:

RET

ENDP

 

R_Ch proc near

mov bx,0

M:

mov ah,08h

int 21h

mov dl,al

mov ah,02h

int 21h

cmp al,' '

jz M

cmp al,13

jz M

mov BUFS[bx],al

M1:

mov ah,08h

int 21h

mov dl,al

mov ah,02h

int 21h

cmp al,' '

jz M2

cmp al,13

jz M2

inc bx

mov BUFS[bx],al

jmp M1

M2:

mov cx,bx

mov al,13

mov ah,02h

int 21h

ret

ENDP

 

PR_Int proc near

push bx

push cx

push dx

test ax,ax

push -1

mov cx,10

wrem:

xor dx,dx

div cx

push dx

test ax,ax

jnz wrem

mov ah,02h

orem:

pop dx

test dx,dx

js output_int_exit

add dl,'0'

int 21h

jmp orem

output_int_exit:

pop dx

pop cx

pop bx

ret

ENDP

 

R_Int proc near

push bx

push cx

push dx

mov bx,0

mov ax,0

inc cx

mov bufs3,cx

m_start:

mov cx,10

mul cx

mov dx,0

push ax

mov dl,BUFS[bx]

mov cx,dx

sub dx,30h

pop ax

add ax,dx

inc bx

mov cx,bufs3

cmp cx,bx

jnz m_start

m_exit:

pop bx

pop cx

pop dx

ret

ENDP

 

outline proc

push dx

mov ah,02h

mov dl,0dh

int 21h

mov dl,0Ah

int 21h

pop dx

ret

outline endp

 

output_logic proc

push dx

test ax,ax

jz  output_logic_false

mov dx, offset $logic_true

jmp output_logic_end

output_logic_false:

mov dx, offset $logic_false

output_logic_end:

mov ah,9h

int 21h

pop dx

ret

output_logic    endp

 

END Start

 

Скомпилируем  и скомпонуем текст программы на языке ассемблера в исполняемый файл в формате COM. Комплиция и компоновка осуществляется с помощью TASM  и MASM.

Рис 5 Результат  работы скомпилированной программы.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ЗАКЛЮЧЕНИЕ.

В ходе настоящей  работы был спроектирован и реализован компилятор, производящий лексический  и синтаксический разбор алгоритма, написанного на языке высокого уровня и генерацию его в код ассемблера.

Данный  программный продукт написан  исключительно в учебных целях  и полностью соотвествуюет задачи, поставленной в техническом задании  и задании на курсовую работу.

 

 

 

СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ.

1. Молчанов  А.Ю. Системное программное обеспечение:  учебник для вузов. 3-е изд. —  СПб.: Питер, 2010. — 400 с.: ил.

2. Ахо, Альфред В., Лам, Моника С., Сети, Рави, Ульман, Джеффри Д. Компиляторы: принципы, технологии и инструментарий, 2-е изд.: Пер. с англ. — М.: ООО “И.Д. Вильямс”, 2008. — 1184 с.: ил. — Парал. тит. англ.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 




Информация о работе Разработка компилятора