编译原理实习报告 .pdf
《编译原理实习报告 .pdf》由会员分享,可在线阅读,更多相关《编译原理实习报告 .pdf(37页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理实习报告 2022 编译 原理 实习 报告
限制150内