《编译原理实习报告 .pdf》由会员分享,可在线阅读,更多相关《编译原理实习报告 .pdf(37页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实习报告姓名:张禧文学号:07302399 班级:07 计 C 编译原理名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 37 页 -编译原理实习报告【实习目的】1.了解编译器的工作原理2.掌握并加深本学期所学的编译原理的理论知识3.加强自己的动手能力【实习内容】1.编译并运行老师所给的编译器参考代码2.在第一步的基础上进一步改进编译器,增加输入输出功能【开发平台】Window 系统,Free Pascal编译器【实习过程】本次实习过程根据实习内容共分两大部分,第一部分,编译运行参考代码;第二部分,进一步改进编译器。本人在上面的基础上又增加了第三部分的额外修改。下面便总结这三部分的
2、实习过程:一、增加读写语句前PL0 编译程序由于最原始的PL0 编译程序所用的PASCAL 版本较老,有些和当前使用版本不兼容,必须作相应修改,具体是:“object”和“procedure”为 PASCAL 的保留字,现分别改成“obj”和“proc”。此外,原始程序中的“”、“”和“”,不能用 ASCII 码表示出来,现将其替换成“”、“=”。作为一个编译程序,支持批量处理和永久保存是其应具备的基本功能。为此,本程序加入了文件读写功能,即从文件读入PL0 源程序,在将中间代码和运行结果写入文件。由于源程序和原始差别很小,为节省篇幅,不将其打印出来。二、增加读写语句前PL0 调试程序下面是增
3、加读写语句前的PL0 程序,包含了乘、除法和寻找两个自然数的最大公因数的过程和主过程,很好的说明了增加读写语句前的PL0 语言的使用方法。const m=7,n=85;var x,y,z,q,r;procedure multiply;var a,b;begin a:=x;名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 37 页 -编译原理实习报告b:=y;z:=0;while b0 do begin if odd b then z:=z+a;a:=2*a;b:=b/2;end end;procedure divide;var w;begin r:=x;q:=0;w:=y;whil
4、e wy do begin q:=2*q;w:=w/2;if w=r then begin r:=r-w;q:=q+1 end end end;procedure gcd;var f,g;begin f:=x;g:=y;while fg do begin if fg then g:=g-f;if g0 do 13 begin 13 if odd b then z:=z+a;20 a:=2*a;24 b:=b/2;28 end 28 end;2 INT 0 5 3 LOD 1 3 4 STO 0 3 5 LOD 1 4 6 STO 0 4 7 LIT 0 0 8 STO 1 5 9 LOD 0
5、4 名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 37 页 -编译原理实习报告10 LIT 0 0 11 OPR 0 12 12 JPC 0 29 13 LOD 0 4 14 OPR 0 6 15 JPC 0 20 16 LOD 1 5 17 LOD 0 3 18 OPR 0 2 19 STO 1 5 20 LIT 0 2 21 LOD 0 3 22 OPR 0 4 23 STO 0 3 24 LOD 0 4 25 LIT 0 2 26 OPR 0 5 27 STO 0 4 28 JMP 0 9 29 OPR 0 0 30 30 procedure divide;30 var
6、31 w;31 begin 32 r:=x;34 q:=0;36 w:=y;38 while wy do 51 begin q:=2*q;w:=w/2;59 if w=r then 62 begin 63 r:=r-w;67 q:=q+1 69 end 71 end 71 end;31 INT 0 4 32 LOD 1 3 33 STO 1 7 34 LIT 0 0 35 STO 1 6 36 LOD 1 4 名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 37 页 -编译原理实习报告37 STO 0 3 38 LOD 0 3 39 LOD 1 7 40 OPR 0 13 41
7、JPC 0 47 42 LIT 0 2 43 LOD 0 3 44 OPR 0 4 45 STO 0 3 46 JMP 0 38 47 LOD 0 3 48 LOD 1 4 49 OPR 0 12 50 JPC 0 72 51 LIT 0 2 52 LOD 1 6 53 OPR 0 4 54 STO 1 6 55 LOD 0 3 56 LIT 0 2 57 OPR 0 5 58 STO 0 3 59 LOD 0 3 60 LOD 1 7 61 OPR 0 13 62 JPC 0 71 63 LOD 1 7 64 LOD 0 3 65 OPR 0 3 66 STO 1 7 67 LOD 1 6
8、68 LIT 0 1 69 OPR 0 2 70 STO 1 6 71 JMP 0 47 72 OPR 0 0 73 73 procedure gcd;73 var 74 f,g;74 begin 75 f:=x;77 g:=y;79 while fg do 名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 37 页 -编译原理实习报告83 begin 83 if fg then g:=g-f;91 if gf then f:=f-g;99 end;100 z:=f 101 end;74 INT 0 5 75 LOD 1 3 76 STO 0 3 77 LOD 1 4 78 STO
9、 0 4 79 LOD 0 3 80 LOD 0 4 81 OPR 0 9 82 JPC 0 100 83 LOD 0 3 84 LOD 0 4 85 OPR 0 10 86 JPC 0 91 87 LOD 0 4 88 LOD 0 3 89 OPR 0 3 90 STO 0 4 91 LOD 0 4 92 LOD 0 3 93 OPR 0 10 94 JPC 0 99 95 LOD 0 3 96 LOD 0 4 97 OPR 0 3 98 STO 0 3 99 JMP 0 79 100 LOD 0 3 101 STO 1 5 102 OPR 0 0 103 103 begin 104 x:=
10、m;106 y:=n;108 call multiply;109 y:=3;111 call divide;112 x:=84;114 y:=36;名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 37 页 -编译原理实习报告116 call gcd;117 end.103 INT 0 8 104 LIT 0 7 105 STO 0 3 106 LIT 0 85 107 STO 0 4 108 CAL 0 2 109 LIT 0 3 110 STO 0 4 111 CAL 0 31 112 LIT 0 84 113 STO 0 3 114 LIT 0 36 115 STO 0 4
11、116 CAL 0 74 117 OPR 0 0 START PL/0 7 85 7 85 0 7 14 42 28 21 35 56 10 112 5 147 224 2 448 1 595 896 0 3 7 0 名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 37 页 -编译原理实习报告3 6 12 0 6 1 1 2 3 84 36 84 36 48 12 24 12 12 END PL/0 四、增加读写语句后PL0 编译程序下面简述在原来的编译程序上增加读写语句的过程:首先,确定读写语句在PL0 语言中的保留字为:read和 write。其功能分别是从键盘读入一整数和向
12、屏幕输出一整数。具体语法是:这将成为语法图中“语句”子图的两个新分支。第二,为 PL0 语言增加读写语句的中间代码:RD l,a:从键盘读入一整数到层差为l 的层、相对地址为a 的变量WRT 0,0:屏幕输出栈顶元素(由write 后面的表达式生成)第三,在程序开始的常量定义部分增加read、write 的符号集和RD、WRT 的功能码。在主程序中增加“read”、“write”保留字定义以及和符号集的关联。在这里应注意保留字应按升序排列。第四、在 statement(语句)函数加上read、write 语句的处理。最后、增加相应的出错代码:31Read 后应为标识符32不可为常量或过程程序中
13、修改部分都用符号标出。read 变量write 表达式名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 37 页 -编译原理实习报告program PL0;const 修改部分开始 norw=13;the number of reserve words 修改部分结束 txmax=100;the length of id table nmax=3;max number of digits in an integer al=10;the length of id amax=2047;the maximum address levmax=3;the maximum depth of su
14、b-functions cxmax=200;the size of the code arrays type symbol=(nul,ident,number,plus,minus,times,slash,oddsym,eql,neq,lss,leq,gtr,geq,lparen,rparen,comma,semicolon,period,becomes,beginsym,endsym,ifsym,thensym,whilesym,dosym,callsym,constsym,varsym,procsym,*修改部分开始:增加保留字符号*readsym,writesym);*修改部分结束*al
15、fa=stringal;obj=(constant,variable,proc);symset=set of symbol;fct=(lit,opr,lod,sto,cal,int,jmp,jpc,*修改部分开始:增加中间代码指令集*rd,wrt);function *修改部分结束*instruction=record f:fct;function code l:0.levmax;level a:0.amax;relative address end;LIT 0,a:Load constant a OPR 0,a:Operate operator a LOD l,a:Load varible
16、a which at level l,relative address a STO l,a:Save varible a to level l,relative address a CAL l,a:Call procedure at level l INT 0,a:Regsiter t increased by a JMP 0,a:Jump to address a 名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 37 页 -编译原理实习报告JPC 0,a:Jump to address a with certain condiction*修改部分开始:增加中间代码指令集注释*
17、RD l,a:Load varible a which at level l,relative address aWRT 0,0:Display the expresion*修改部分结束*var in_file,out_file:text;ch:char;the latest read character sym:symbol;the latest read sumbol id:alfa;the latest read id num:integer;the latest read number cc:integer;coount the characters ll:integer;the le
18、ngth of a line kk,err:integer;cx:integer;the index of the codes line:array1.81 of char;a:alfa;code:array0.cxmax of instruction;word:array1.norw of alfa;wsym:array1.norw of symbol;ssym:arraycharof symbol;mnemonic:arrayfct of string5;declbegsys,statbegsys,facbegsys:symset;table:array0.txmax of record
19、name:alfa;case kind:obj of constant:(val:integer);variable,proc:(level,adr:integer)end;procedure error(n:integer);begin writeln(out_file,*,:cc-1,n:2);err:=err+1;end;procedure init;begin Set and Open files assign(in_file,test.pl0);assign(out_file,test.mid);名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 37 页 -编译原理实习
20、报告reset(in_file);rewrite(out_file);end;init procedure quit;begin writeln(out_file);Close files close(out_file);close(in_file);halt;end;quit procedure getsym;var i,j,k:integer;procedure getch;begin getch if cc=ll then begin if eof(in_file)then begin writeln(out_file,PROGRAM INCOMPLETE);quit;end;ll:=0
21、;cc:=0;write(out_file,cx:5,);while not(eoln(in_file)do begin ll:=ll+1;read(in_file,ch);write(out_file,ch);linell:=ch;end;writeln(out_file);ll:=ll+1;repeat read(in_file,linell);until linell#13;end;名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 37 页 -编译原理实习报告cc:=cc+1;ch:=linecc;end;getch begin getsym while ch in ,#9
22、,#10,#13 do getch;if ch in a.z then begin ids or reserve words k:=0;a:=;repeat if k=kk then kk:=k else repeat akk:=;kk:=kk-1;until kk=k;id:=a;i:=1;j:=norw;repeat k:=(i+j)div 2;if id=wordk then i:=k+1;until ij;if i-1j then sym:=wsymk else sym:=ident;end else if ch in 0.9 then begin number k:=0;num:=0
23、;sym:=number;repeat num:=10*num+(ord(ch)-ord(0);k:=k+1;名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 37 页 -编译原理实习报告getch;until not(ch in 0.9);if knmax then error(30);end else if ch=:then begin getch;if ch=then begin sym:=becomes;getch;end else sym:=nul;end 下面处理“”,“=”else if ch=then begin getch;if ch=then begin sy
24、m:=geq;getch;end else sym:=gtr;end else if ch=then begin sym:=neq;getch;end else sym:=lss;end 名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 37 页 -编译原理实习报告else begin sym:=ssymch;getch;end;end;getsym procedure gen(x:fct;y,z:integer);begin if cxcxmax then begin write(out_file,PROGRAM TOO LONG);quit;end;with codecx d
25、o begin f:=x;l:=y;a:=z;end;cx:=cx+1;end;gen procedure test(s1,s2:symset;n:integer);begin if not(sym in s1)then begin error(n);s1:=s1+s2;while not(sym in s1)do getsym;end;end;test procedure block(lev,tx:integer;fsys:symset);var dx:integer;index of data tx0:integer;index of start ids cx0:integer;index
26、 of start codes procedure enter(k:obj);begin put obj into id table tx:=tx+1;with tabletx do begin name:=id;名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 37 页 -编译原理实习报告kind:=k;case k of constant:begin if numamax then begin error(30);num:=0;end;val:=num;end;variable:begin level:=lev;adr:=dx;dx:=dx+1;end;proc:level:
27、=lev;end;end;end;enter function position(id:alfa):integer;var i:integer;begin search id in the id table table0.name:=id;i:=tx;while tablei.nameid do i:=i-1;position:=i;end;position procedure constdeclaration;begin if sym=ident then begin getsym;if sym in eql,becomes then begin if sym=becomes then er
28、ror(1);getsym;if sym=number then begin 名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 37 页 -编译原理实习报告enter(constant);getsym;end else error(2);end else error(3)end else error(4);end;constadeclaration procedure vardeclaration;begin vardeclaration if sym=ident then begin enter(variable);getsym;end else error(4);end;va
29、rdeclaration procedure listcode;var i:integer;begin list the codes generated by this program for i:=cx0 to cx-1 do with codei do writeln(out_file,i,mnemonicf:5,l:3,a:5);end;listcode procedure statement(fsys:symset);var i,cx1,cx2:integer;procedure expression(fsys:symset);var addop:symbol;procedure te
30、rm(fsys:symset);var mulop:symbol;procedure factor(fsys:symset);var i:integer;名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 37 页 -编译原理实习报告begin factor test(facbegsys,fsys,24);while sym in facbegsys do begin while if sym=ident then begin i:=position(id);if i=0 then error(11)else with tablei do case kind of constant
31、:gen(lit,0,val);variable:gen(lod,lev-level,adr);proc:error(21);end;getsym;end else if sym=number then begin if numamax then begin error(30);num:=0;end;gen(lit,0,num);getsym;end else if sym=lparen then begin getsym;expression(rparen+fsys);if sym=rparen then getsym else error(22);end;test(fsys,lparen,
32、23);end;while end;factor 名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 37 页 -编译原理实习报告begin term factor(fsys+times,slash);while sym in times,slash do begin mulop:=sym;getsym;factor(fsys+times,slash);if mulop=times then gen(opr,0,4)else gen(opr,0,5);end;end;term begin expression if sym in plus,minus then begin addo
33、p:=sym;getsym;term(fsys+plus,minus);if addop=minus then gen(opr,0,1);end else term(fsys+plus,minus);while sym in plus,minus do begin addop:=sym;getsym;term(fsys+plus,minus);if addop=plus then gen(opr,0,2)else gen(opr,0,3);end;end;expression procedure condition(fsys:symset);var relop:symbol;begin con
34、dition if sym=oddsym then begin getsym;expression(fsys);gen(opr,0,6);end else 名师资料总结-精品资料欢迎下载-名师精心整理-第 19 页,共 37 页 -编译原理实习报告begin expression(eql,neq,lss,gtr,leq,geq+fsys);if not(sym in eql,neq,lss,leq,gtr,geq)then error(20)else begin relop:=sym;getsym;expression(fsys);case relop of eql:gen(opr,0,8);
35、neq:gen(opr,0,9);lss:gen(opr,0,10);geq:gen(opr,0,11);gtr:gen(opr,0,12);leq:gen(opr,0,13);end;end;end;end;condition begin statement if sym=ident then begin i:=position(id);if i=0 then error(11)else if tablei.kindvariable then begin assign valve to something that is not varible error(12);i:=0;end;gets
36、ym;if sym=becomes then getsym else error(13);expression(fsys);if i0 then with tablei do gen(sto,lev-level,adr);end else if sym=callsym then begin getsym;if symident then error(14)else 名师资料总结-精品资料欢迎下载-名师精心整理-第 20 页,共 37 页 -编译原理实习报告begin i:=position(id);if i=0 then error(11)else with tablei do if kind
37、=proc then gen(cal,lev-level,adr)else error(15);getsym;end;end else if sym=ifsym then begin getsym;condition(thensym,dosym+fsys);if sym=thensym then getsym else error(16);cx1:=cx;gen(jpc,0,0);statement(fsys);codecx1.a:=cx;end else if sym=beginsym then begin getsym;statement(semicolon,endsym+fsys);wh
38、ile sym in semicolon+statbegsys do begin if sym=semicolon then getsym else error(10);statement(semicolon,endsym+fsys);end;if sym=endsym then getsym else error(17);end else if sym=whilesym then begin cx1:=cx;getsym;condition(dosym+fsys);cx2:=cx;gen(jpc,0,0);if sym=dosym then getsym 名师资料总结-精品资料欢迎下载-名师
39、精心整理-第 21 页,共 37 页 -编译原理实习报告else error(18);statement(fsys);gen(jmp,0,cx1);codecx2.a:=cx;end*增加部分开始*增加读语句处理 else if sym=readsym then begin getsym;if sym ident then error(31)else begin i:=position(id);if i=0 then error(11)else with tablei do if kind=variable then gen(rd,lev-level,adr)else error(32);ge
40、tsym;end end 增加写语句处理 else if sym=writesym then begin getsym;expression(fsys);gen(wrt,0,0);end;*增加部分结束*test(fsys,19);end;statement begin block dx:=3;tx0:=tx;tabletx.adr:=cx;gen(jmp,0,0);名师资料总结-精品资料欢迎下载-名师精心整理-第 22 页,共 37 页 -编译原理实习报告if levlevmax then error(32);repeat if sym=constsym then begin getsym;
41、repeat constdeclaration;while sym=comma do begin getsym;constdeclaration;end;if sym=semicolon then getsym else error(5);until symident;end;if sym=varsym then begin getsym;repeat vardeclaration;while sym=comma do begin getsym;vardeclaration;end;if sym=semicolon then getsym else error(5);until symiden
42、t;end;while sym=procsym do begin getsym;if sym=ident then begin enter(proc);getsym;end else error(4);if sym=semicolon then getsym 名师资料总结-精品资料欢迎下载-名师精心整理-第 23 页,共 37 页 -编译原理实习报告else error(5);block(lev+1,tx,semicolon+fsys);if sym=semicolon then begin getsym;test(statbegsys+ident,procsym,fsys,6);end el
43、se error(5);end;test(statbegsys+ident,declbegsys,7);until not(sym in declbegsys);codetabletx0.adr.a:=cx;with tabletx0 do begin adr:=cx;the start address of the codes end;cx0:=cx;gen(int,0,dx);statement(semicolon,endsym+fsys);gen(opr,0,0);return test(fsys,8);listcode;end;block procedure interpret;con
44、st stacksize=500;var p,b,t:integer;registers for program,base and stack address i:instruction;register for instruction s:array1.stacksize of integer;to store data function base(l:integer):integer;var b1:integer;begin b1:=b;to find the base address of the level at l along the link while l0 do begin b
45、1:=sb1;l:=l-1;end;base:=b1;end;base 名师资料总结-精品资料欢迎下载-名师精心整理-第 24 页,共 37 页 -编译原理实习报告begin interpret writeln(out_file,START PL/0);t:=0;b:=1;p:=0;s1:=0;s2:=0;s3:=0;repeat i:=codep;p:=p+1;with i do case f of lit:begin t:=t+1;st:=a;end;opr:case a of operate 0:return begin t:=b-1;p:=st+3;b:=st+2;end;1:st:=
46、-st;2:begin t:=t-1;st:=st+st+1;end;3:begin t:=t-1;st:=st-st+1;end;4:begin t:=t-1;st:=st*st+1;end;5:名师资料总结-精品资料欢迎下载-名师精心整理-第 25 页,共 37 页 -编译原理实习报告begin t:=t-1;st:=st div st+1;end;6:st:=ord(odd(st);8:begin t:=t-1;st:=ord(st=st+1);end;9:begin t:=t-1;st:=ord(stst+1);end;10:begin t:=t-1;st:=ord(st=st+1);
47、end;12:begin t:=t-1;st:=ord(stst+1);end;13:begin t:=t-1;st:=ord(st=st+1);end;end;lod:begin t:=t+1;st:=sbase(l)+a;end;sto:begin sbase(l)+a:=st;名师资料总结-精品资料欢迎下载-名师精心整理-第 26 页,共 37 页 -编译原理实习报告writeln(out_file,st);t:=t-1;end;cal:begin generate new block mark st+1:=base(l);st+2:=b;st+3:=p;b:=t+1;p:=a;end;
48、int:begin t:=t+a;end;jmp:begin p:=a;end;jpc:begin if st=0 then p:=a;t:=t-1;end;*增加部分开始*增加模拟读指令解释 rd:begin write(Input:);read(sbase(l)+a);end;增加模拟写指令解释 wrt:begin write(Output:);write(out_file,Output:);writeln(st);writeln(out_file,st);t:=t-1;end;*增加部分结束*end;with until p=0;writeln(out_file,END PL/0);名师
49、资料总结-精品资料欢迎下载-名师精心整理-第 27 页,共 37 页 -编译原理实习报告end;interpret begin Main init;Main procedure for ch:=A to;do ssymch:=nul;word 1:=begin;BEGIN;word 2:=call;CALL;word 3:=const;CONST;word 4:=do;DO;word 5:=end;END;word 6:=if;IF;word 7:=odd;ODD;word 8:=procedure;PROCEDURE;*增加部分开始:增加读保留字*word 9:=read;*增加部分结束*w
50、ord10:=then;THEN;word11:=var;V AR;word12:=while;WHILE;*增加部分开始:增加写保留字*word13:=write;*增加部分结束*wsym 1:=beginsym;wsym 2:=callsym;wsym 3:=constsym;wsym 4:=dosym;wsym 5:=endsym;wsym 6:=ifsym;wsym 7:=oddsym;wsym 8:=procsym;*增加部分开始:增加对应读符号*wsym 9:=readsym;*增加部分结束*wsym10:=thensym;wsym11:=varsym;wsym12:=whiles