Автор работы: Пользователь скрыл имя, 12 Декабря 2012 в 01:25, курсовая работа
Наименование программного продукта – «Компилятор».
Область применения программного продукта – разработка программного обеспечения, трансляция с языка высокого уровня на язык ассемблера.
Разработка предназначена для компиляции программы из исходного кода в код на языке ассемблера.
1 ТЕХНИЧЕСКОЕ ЗАДАНИЕ. 4
2 ОПИСАНИЕ ПРОГРАММЫ. 7
3 ТЕКСТ ПРОГРАММЫ. 17
4 КОНТРОЛЬНЫЙ ПРИМЕР ИСПОЛЬЗОВАНИЯ 47
ЗАКЛЮЧЕНИЕ 64
26:writeln('Ожидалось loop',' строка-',cur_stroka);
27:writeln('Массив не объявлен',' строка-',cur_stroka);
28:writeln('Операнды имеют неприводимый тип',' строка-',cur_stroka);
29:writeln('Нельзя присвоить переменнай массив',' строка-',cur_stroka);
30:writeln('Ожидалось while или until',' строка-',cur_stroka);
end;
close(f1);
close(f2);
close(f3);
close(f4);
halt;
end;
procedure setident;
var j,cur:integer;
begin
cur:=nom_analiz;
For i:=1 to cur do
If analiz[i].table='i' then
For j:=i to cur do
If (analiz[i].table=analiz[j].
begin
analiz[j].type_i:=analiz[i].
If analiz[i].mas=1 then analiz[j].mas:=1;
end;
end;
procedure pr;
var st:string;
begin
current_analiz:=1;
If (analiz[current_analiz].table<
current_analiz:=current_
If not (analiz[current_analiz].table=
current_analiz:=current_
if not ((analiz[current_analiz].
current_analiz:=current_
cur_stroka:=1;
writeln(f6,'.model tiny');
writeln(f6,'.Code');
writeln(f6,'org 100h');
writeln(f6,'');
writeln(f6,'Start:');
Declar;
setident;
Block;
If not ((analiz[current_analiz].
current_analiz:=current_
If not ((analiz[current_analiz].
writeln(f6,'');
writeln(f6,'EndKode:');
writeln(f6,'mov ax, 4Ch');
writeln(f6,'int 21h');
writeln(f6,'');
writeln(f6,'.Data');
reset(f7);
while eof(f7)=false do
begin
readln(f7,st);
writeln(f6,st);
end;
writeln(f6,'BUF':5,'DW':5, '5':3, 'DUP':5, '(?)');
writeln(f6,'bufs1':5, 'DW':5, ' ?');
writeln(f6,'bufs2':5, 'DW':5, ' ?');
writeln(f6,'bufs3':5, 'DW':5, ' ?');
writeln(f6,'BUFS':5, 'DB':5, '50':3, 'DUP':5, '(?)');
writeln(f6,'$logic_true':5, 'db':5,' ''true $''');
writeln(f6,'$logic_false':5, 'db':5,' ''false $''');
writeln(f6,'');
AddProcedures;
writeln(f6,'END Start');
end;
procedure declar;
var mas_i:array[0..10] of integer;
cur_i,j:integer;
flag:boolean;
begin
if not ((analiz[current_analiz].
While not ((analiz[current_analiz+1].
Begin
cur_stroka:=cur_stroka+1;
flag:=false;
cur_i:=0;
current_analiz:=current_
if not (analiz[current_analiz].table=
if ((analiz[current_analiz+1].
While not ((analiz[current_analiz+1].
Begin
flag:=true;
mas_i[cur_i]:=current_analiz;
current_analiz:=current_
If not ((analiz[current_analiz].
current_analiz:=current_
If not (analiz[current_analiz].table=
If ((analiz[current_analiz+1].
End;
if flag=false then cur_i:=current_analiz;
current_analiz:=current_
if not ((analiz[current_analiz].
current_analiz:=current_
if not (analiz[current_analiz].table=
Case analiz[current_analiz].nomer of
16:begin
If flag=true then
begin
for i:=0 to cur_i-1 do
begin
analiz[mas_i[i]].type_i:=tab_
writeln(f7,tab_ident[analiz[
end;
end
else
begin analiz[cur_i].type_i:=tab_i[
end;
17:begin
If flag=true then
begin
for i:=0 to cur_i-1 do
begin
analiz[mas_i[i]].type_i:=tab_
writeln(f7,tab_ident[analiz[
end;
end
else
begin analiz[cur_i].type_i:=tab_i[
end;
18:begin
If flag=true then
begin
for i:=0 to cur_i-1 do
begin
analiz[mas_i[i]].type_i:=tab_
writeln(f7,tab_ident[analiz[
end;
end
else
begin analiz[cur_i].type_i:=tab_i[
end;
19:begin
If flag=true then
begin
for i:=0 to cur_i-1 do
begin
analiz[mas_i[i]].type_i:=tab_
writeln(f7,tab_ident[analiz[
end;
end
else
begin analiz[cur_i].type_i:=tab_i[
end;
20: begin
mass;
If flag=true then
begin
for i:=0 to cur_i-1 do
begin
analiz[mas_i[i]].type_i:=tab_
analiz[mas_i[i]].mas:=1;
If analiz[current_analiz].nomer=
writeln(f7,tab_ident[analiz[
end;
end
else
begin analiz[cur_i].type_i:=tab_i[
end;
Else error(10);
end;
current_analiz:=current_
if not ((analiz[current_analiz].
end;
cur_stroka:=cur_stroka+1;
end;
procedure block;
//var FR,TR,ER:real;
Procedure FL;forward;
procedure TL;forward;
Procedure T;forward;
Procedure F;forward;
procedure E;forward;
procedure operator;forward;
procedure op_if;forward;
procedure op_pr;forward;
Procedure op_while; forward;
Procedure op_read;forward;
Procedure op_write;forward;
procedure gen_metok;
begin
inc(cur_met);
g_met:='MET'+inttostr(cur_met)
end;
procedure L;
begin
TL;
While (analiz[current_analiz+1].
begin
current_analiz:=current_
if (analiz[current_analiz].table=
begin
TL;
writeln(f6,'POP AX');
writeln(f6,'POP BX');
writeln(f6,'OR AX,BX');
writeln(f6,'PUSH AX');
end else Error(11);
end;
end;
Procedure TL;
begin
FL;
While (analiz[current_analiz+1].
begin
current_analiz:=current_
if (analiz[current_analiz].table=
begin
FL;
writeln(f6,'POP AX');
writeln(f6,'POP BX');
writeln(f6,'AND AX,BX');
writeln(f6,'PUSH AX');
end else Error(11);
end;
end;
Procedure FL;
var zn_ot:string;
met:string;
a:integer;
begin
current_analiz:=current_
If analiz[current_analiz].table='
begin
a:=analiz[current_analiz].
current_analiz:=current_
if (analiz[current_analiz].table=
begin
current_analiz:=current_
E;
If not(tab_razdel[analiz[current_
else begin
writeln(f6,'POP BX');
writeln(f6,'MOV AL, ',tab_ident[a],'[BX]');
writeln(f6,'PUSH AX');
end;
end else begin
writeln(f6,'MOV AL, ',tab_ident[a]);
writeln(f6,'PUSH AX');
end;
end else
If tab_razdel[analiz[current_
begin
//current_analiz:=current_
l;
current_analiz:=current_
If not(tab_razdel[analiz[current_
end else
If tab_i[analiz[current_analiz].
begin
writeln(f6,'MOV AX,1');
writeln(f6,'PUSH AX');
exit;
end
else
If tab_i[analiz[current_analiz].
begin
writeln(f6,'MOV AX,0');
writeln(f6,'PUSH AX');
exit;
end
else
If tab_i[analiz[current_analiz].
begin
current_analiz:=current_
FL; //change
writeln(f6,'POP AX');
writeln(f6,'NOT AX');
writeln(f6,'PUSH AX');
current_analiz:=current_
end else
If tab_razdel[analiz[current_
begin
current_analiz:=current_
E;
If ((tab_razdel[analiz[current_
else
begin
If analiz[current_analiz].table='
current_analiz:=current_
E;
writeln(f6,'POP BX'); // b
writeln(f6,'POP AX'); // a
writeln(f6,'CMP AX,BX');
gen_metok;
If zn_ot='>=' then writeln(f6,'JGE ',g_met);
If zn_ot='<=' then writeln(f6,'JLE ',g_met);
If zn_ot='<>' then writeln(f6,'JNE ',g_met);
If zn_ot='>' then writeln(f6,'JG ',g_met);
If zn_ot='<' then writeln(f6,'JL ',g_met);
if zn_ot='=' then writeln(f6,'JE ',g_met);
writeln(f6,'PUSH 0'); // FALSE
met:=g_met;
gen_metok;
writeln(f6,'JMP ',g_met);
writeln(f6,met,':');
writeln(f6,'PUSH 1'); // TRUE
writeln(f6,g_met,':');
if not(tab_razdel[analiz[current_
else exit;
end;
end;
end;
procedure pr_mas;
begin
If analiz[current_analiz].mas=0 then error(27);
current_analiz:=current_
if not ((analiz[current_analiz].
current_analiz:=current_
E;
if not ((analiz[current_analiz].
end;
procedure E;
begin
T;
While (tab_razdel[analiz[current_
If tab_razdel[analiz[current_
else If tab_razdel[analiz[current_
end;
Procedure T;
begin
F;
While (tab_razdel[analiz[current_
If tab_razdel[analiz[current_
else if tab_razdel[analiz[current_
else begin error(16); end;
end;
Procedure F;
var a:integer;
begin
If (analiz[current_analiz].table=
begin If (analiz[current_analiz].table=
begin
cur_vir:=cur_vir+1;
type_virag[cur_vir]:=analiz[
if (analiz[current_analiz].mas=1) and (tab_razdel[analiz[current_
If (analiz[current_analiz+1].
else begin
if analiz[current_analiz].type_i=
else begin Writeln(f6,'mov al,',tab_ident[analiz[current_
end;
end