Автор работы: Пользователь скрыл имя, 12 Декабря 2012 в 01:25, курсовая работа
Наименование программного продукта – «Компилятор».
Область применения программного продукта – разработка программного обеспечения, трансляция с языка высокого уровня на язык ассемблера.
Разработка предназначена для компиляции программы из исходного кода в код на языке ассемблера.
1 ТЕХНИЧЕСКОЕ ЗАДАНИЕ. 4
2 ОПИСАНИЕ ПРОГРАММЫ. 7
3 ТЕКСТ ПРОГРАММЫ. 17
4 КОНТРОЛЬНЫЙ ПРИМЕР ИСПОЛЬЗОВАНИЯ 47
ЗАКЛЮЧЕНИЕ 64
if (analiz[current_analiz].nomer=
if (analiz[current_analiz].nomer=
if (analiz[current_analiz].nomer=
if (analiz[current_analiz].nomer=
end;
if analiz[current_analiz+1].
cur_stroka:=cur_stroka+1;
end;
begin
current_analiz:=current_
If not ((analiz[current_analiz].
While not((analiz[current_analiz+1].
begin
operator;
//cur_stroka:=cur_stroka+1;
current_analiz:=current_
If not ((analiz[current_analiz].
end;
current_analiz:=current_
If not((analiz[current_analiz].
end;
procedure mass;
begin
current_analiz:=current_
if not ((analiz[current_analiz].
current_analiz:=current_
if not (analiz[current_analiz].table=
ch1_mas:=strtoint(tab_cifri[
current_analiz:=current_
if not ((analiz[current_analiz].
current_analiz:=current_
if not (analiz[current_analiz].table=
ch2_mas:=strtoint(tab_cifri[
current_analiz:=current_
if not ((analiz[current_analiz].
current_analiz:=current_
if not ((analiz[current_analiz].
current_analiz:=current_
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. Молчанов
А.Ю. Системное программное
2. Ахо, Альфред В., Лам, Моника С., Сети, Рави, Ульман, Джеффри Д. Компиляторы: принципы, технологии и инструментарий, 2-е изд.: Пер. с англ. — М.: ООО “И.Д. Вильямс”, 2008. — 1184 с.: ил. — Парал. тит. англ.