2022年PL源代码.docx

上传人:Che****ry 文档编号:27203209 上传时间:2022-07-23 格式:DOCX 页数:57 大小:92.74KB
返回 下载 相关 举报
2022年PL源代码.docx_第1页
第1页 / 共57页
2022年PL源代码.docx_第2页
第2页 / 共57页
点击查看更多>>
资源描述

《2022年PL源代码.docx》由会员分享,可在线阅读,更多相关《2022年PL源代码.docx(57页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -/*PL/0 编译系统 C 版本头文件 pl0.h*/ # define norw 13 /a number of reserved word /* 关键字个数 */ # define txmax 100 /length of identifier table /*名字表容量 */ # define nmax 14 /max number of digits in numbers /*number 的最大位数 */ # define al 10 /length of identifier /* 符号的最大长度

2、 */ # define amax 2047 /maximum address /* 地址上界 */ # define levmax 3 /max depth of block nesting /* 最大答应过程嵌套声明层数0,lexmax*/ # define cxmax 200 /size of code array /* 最多的虚拟机代码数*/ /* 符号 */ enum symbol lss, nul, ident, number, plus, minus, times, slash, oddsym, eql, neq, /slash 斜线leq, gtr, geq, lparen,

3、/leq :less than or equal to; gtr: great than;lparen:left parenthesis rparen, comma, semicolon,period, becomes,/comma 逗号 semicolon 分号period 句号becomes 赋值号beginsym, endsym, ifsym, thensym, whilesym, writesym, readsym, dosym, callsym, constsym, varsym, procsym, ; #define symnum 32 /*-*/ enum object /obj

4、ect 为三种标识符的类型constant, variable, procedur, ; /*-*/ enum fct /fct 类型分别标识类 PCODE 的各条指令lit, opr, lod, sto, cal, inte, jmp, jpc, /书本 P23 ; #define fctnum 8 /*-*/ struct instruction /指令 enum fct f; /功能码int l; /层次差int a; /P23 ; FILE * fas; /输出名字表 第 1 页,共 33 页 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - -

5、- - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -FILE * fa; /输出虚拟机代码FILE * fa1; /输出源文件及其各行对应的首地址FILE * fa2; /输出结果bool tableswitch; /显示名字表与否bool listswitch; /显示虚拟机代码与否char ch; /猎取字符的缓冲区 ,getch 使用enum symbol sym; /当前符号char idal+1; /当前 ident,多出一个字节用于存放 0 int num; /当前 number int cc,ll; /getch

6、使用的计数器 ,cc 表示当前字符 ch的位置int cx; /虚拟机代码指针,取值范畴 0,cxmax-1 char line81; /读取行缓冲区char aal+1; /暂时符号,多出的一个字节用于存放 0 struct instruction codecxmax; /存放虚拟机代码的数组char wordnorwal; /保留字enum symbol wsymnorw; /保留字对应的符号值enum symbol ssym256; /单字符的符号值char mnemonicfctnum5; /虚拟机代码指令名称bool declbegsyssymnum; /表示声明开头的符号集合 ,d

7、eclaring begin symbol set bool statbegsyssymnum; /表示语句开头的符号集 , statement bool facbegsyssymnum; /表示因子开头的符号集合 ,factor /*-*/ struct tablestruct char nameal; /* 名字 */ enum object kind; /* 类型: const, var,array or procedure*/ int val; /* 数值,仅const 使用 */ procedure 使int level; /* 所处层,仅const 不使用 */ int adr;

8、/* 地址,仅 const 不使用 */ int size; /* 需要安排的数据区空间,仅用*/ ; struct tablestruct tabletxmax; /* 名字表 */ FILE * fin; /fin 文本文件用于指向输入的源程序文件 FILE* fout; /fout 文本文件用于指向输出的文件 char fnameal; int err; /* 错误计数器 */ */ 第 2 页,共 33 页 /* 当函数中会发生fatal error 时,返回 1 告知调用它的函数,最终退出程序#define getsymdo if-1=getsymreturn -1 细心整理归纳 精

9、选学习资料 - - - - - - - - - - - - - - - - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -#define getchdo if-1=getchreturn -1 #define testdoa,b,c #define gendoa,b,c #define expressiondoa,b,c #define factordoa,b,c #define termdoa,b,c #define conditiondoa,b,c #define statementdoa,b,c #define co

10、nstdeclarationdoa,b,c #define vardeclarationdoa,b,c void errorint n; int getsym; int getch; void init; int genenum fct x,int y,int z; int testbool*s1,bool*s2,int n; int insetint e,bool*s; if-1=testa,b,creturn -1 if-1=gena,b,creturn -1 if-1=expressiona,b,creturn -1 if-1=factora,b,creturn -1 if-1=term

11、a,b,creturn -1 if-1=conditiona,b,creturn -1 if-1=statementa,b,creturn -1 if-1=constdeclarationa,b,creturn -1 if-1=vardeclarationa,b,creturn -1 int addsetbool*sr,bool*s1,bool*s2,int n; int subsetbool*sr,bool*s1,bool*s2,int n; int mulsetbool*sr,bool*s1,bool*s2,int n; int blockint lev,int tx,bool* fsys

12、; void interpret; int factorbool* fsys,int* ptx,int lev; int termbool*fsys,int*ptx,int lev; int conditionbool*fsys,int*ptx,int lev; int expressionbool*fsys,int*ptx,int lev; int statementbool*fsys,int*ptx,int lev; void listcodeint cx0; int vardeclarationint* ptx,int lev, int* pdx; int constdeclaratio

13、nint* ptx,int lev, int* pdx; int positionchar* idt,int tx; void enterenum object k,int* ptx,int lev,int* pdx; int baseint l,int* s,int b; 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 3 页,共 33 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -/A.2 C 版本/* 编译和运行环境 : *1Visual C+6.0,VisualC

14、+.NET and Visual C+.NET 2003 *WinNT, Win 200, WinXP and Win2003 *2 gcc version 3.3.2 20031022Red Hat Linux 3.3.2-1 *Redhat Fedora core 1 *Intel 32 platform *使用方法 : *运行后输入 PL/0 源程序文件名 *回答是否输出虚拟机代码 *回答是否输出名字表 *fa.tmp 输出虚拟机代码 *fa1.tmp 输出源文件及其各行对应的首地址 *fa2.tmp 输出结果 *fas.tmp 输出名字表*/ #include #includepl0.

15、h #includestring.h /* 说明执行时使用的栈 */ #define stacksize 500 int main bool nxtlevsymnum; printfInput pl/0 file .; scanf%s,fname; /* 输入文件名 */ fin=fopenfname,r; /返回值:文件顺当打开后,指向该流的文件指针就会被返回;假如文件打开失败就返回NULL ,并把错误代码存在errno 中iffin printfList object code .Y/N; /*是否输出虚拟机代码*/ scanf%s,fname; listswitch=fname0=y|f

16、name0=Y; printfList symbol table . Y/N; /* 是否输出名字表*/ scanf%s,fname; tableswitch=fname0=y|fname0=Y; fa1=fopenfa1.tmp,w; fprintffa1,Iput pl/0 file .; fprintffa1,%sn, fname; init; /*初始化 */ 0 err=0; / 错误计数器置cc=cx=ll=0; ch= ; 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 4 页,共 33 页 - - - - - - - - - 名师归纳

17、总结 精品学习资料 - - - - - - - - - - - - - - -if-1.=getsym fa=fopenfa.tmp,w; fas=fopenfas.tmp,w; addsetnxtlev,declbegsys,statbegsys,symnum; nxtlevperiod=true; if-1=block0,0,nxtlev /*调用编译程序 */ fclosefa; fclosefa1; fclosefas; fclosefin; printfn; return 0; fclosefa; fclosefa1; fclosefas; ifsym.=period error9;

18、 iferr=0 fa2=fopenfa2.tmp, w; interpret; fclosefa2; else printfErrors in pl/0 program; fclosefin; else printfCant open file. n; printfn; return 0; /* *初始化细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 5 页,共 33 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -*/ void init int i; fori=0;i

19、=255;i+ ssymi=nul; /ssym :单字符的符号值 ssym+=plus; ssym-=minus; ssym*=times; ssym/=slash; ssym=lparen; ssym=rparen; ssym=eql; ssym,=comma; ssym.=period; ssym#=neq; ssym;=semicolon; /*设置保留字名字 ,根据字母次序 ,便于折半查找 */ strcpy&word00,begin; strcpy&word10,call; strcpy&word20,const; strcpy&word30,do; strcpy&word40,e

20、nd; strcpy&word50,if; strcpy&word60,odd; strcpy&word70,procedure; strcpy&word80,read; strcpy&word90,then; strcpy&word100,var; strcpy&word110,while; strcpy&word120,write; /*设置保留字符号 */ wsym0=beginsym; wsym1=callsym; wsym2=constsym; wsym3=dosym; wsym4=endsym; wsym5=ifsym; wsym6=oddsym; wsym7=procsym; w

21、sym8=readsym; wsym9=thensym; 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 6 页,共 33 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -wsym10=varsym; wsym11=whilesym; wsym12=writesym; /*设置指令名称 */ strcpy&mnemoniclit0,lit; strcpy&mnemonicopr0,opr; strcpy&mnemoniclod0,lod; strcpy&mnemonicst

22、o0,sto; strcpy&mnemoniccal0,cal; strcpy&mnemonicinte0,int; strcpy&mnemonicjmp0,jmp; strcpy&mnemonicjpc0,jpc; /*设置符号集 */ fori=0;isymnum;i+ declbegsysi=false; statbegsysi=false; facbegsysi=false; /*设置声明开头符号集 */ declbegsysconstsym=true; declbegsysvarsym=true; declbegsysprocsym=true; /*设置语句开头符号集 */ stat

23、begsysbeginsym=true; statbegsyscallsym=true; statbegsysifsym=true; statbegsyswhilesym=true; /*设置因子开头符号集 */ facbegsysident=true; facbegsysnumber=true; facbegsyslparen=true; /* * 用数组实现集合的集合运算 */ int insetint e,bool* s return se; int addsetbool* sr,bool* s1,bool* s2,int n 细心整理归纳 精选学习资料 - - - - - - - -

24、- - - - - - - 第 7 页,共 33 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - - int i; fori=0;in;i+ sri=s1i|s2i; return 0; int subsetbool* sr,bool* s1,bool* s2,int n int i; fori=0;in;i+ sri=s1i&.s2i; return 0; int mulsetbool* sr,bool* s1,bool* s2,int n int i; fori=0;i=a&ch=z k=0; do ifk=a&c

25、h=0&ch=9; ak=0; strcpyid,a; i=0; j=norw-1; do k=i+j/2; ifstrcmpid,wordk=0 i=k+1; whileij sym=wsymk; else sym=ident; else ifch=0&ch=0&chnmax error30; else ifch=: /* 检测赋值符号 */ getchdo; ifch= sym=becomes; getchdo; else sym=nul; /* 不能识别的符号*/ else ifch= /* 检测大于或大于等于符号*/ getchdo; ifch= sym=geq; getchdo; e

26、lse sym=gtr; else sym=ssymch;/* 当符号不满意上述条件时,全部根据单字符号 处理 */ /getchdo; /richard ifsym.=period getchdo; /end richard return 0; /* *生成虚拟机代码 * *x:instruction.f; *y:instruction.l; *z:instruction.a; */ int genenum fct x,int y,int z ifcx=cxmax printfProgram too long; /* 程序过长 */ return -1; 细心整理归纳 精选学习资料 - -

27、- - - - - - - - - - - - - 第 12 页,共 33 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - - codecx.f=x; codecx.l=y; codecx.a=z; cx+; return 0; /* *测试当前符号是否合法 * *在某一部分(如一条语句,一个表达式)将要终止时时我们期望下一个符号属于某集合 *(该部分的后跟符号)test 负责这项检测,并且负责当检测不通过时的补救措施 *程序在需要检测时指定当前需要的符号集合和补救用的集合(如之前未完成部分的后跟 *符号),以及不通过

28、时的错误号 * *S1:我们需要的符号 *s2:假如不是我们需要的,就需要一个补救用的集合 *n: 错误号 */ int testbool* s1,bool* s2,int n if. insetsym,s1 errorn; /* 当检测不通过时,不停猎取符号,直到它属于需要的集合或补救的集合 */ while. insetsym,s1&. insetsym,s2 getsymdo; return 0; /* *编译程序主体 * *lev: 当前分程序所在层 *tx: 名字表当前尾指针 *fsys: 当前模块后跟符号集合 */ int blockint lev,int tx,bool* fsy

29、s int i; 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 13 页,共 33 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -int dx; /* 名字安排到的相对地址*/ int tx0; /*保留初始 tx*/ int cx0; /* 保留初始 cx*/ bool nxtlevsymnum; 使用数组上级函数的dx=3; /* 在下级函数的参数中,符号集合均为值参,但由于 实现,传递进来的是指针,为防止下级函数转变集合,开创新的空间传递给下级函数 */ tx0=

30、tx; /* 记录本层名字的初始位置*/ tabletx.adr=cx; gendojmp,0,0; iflev levmax error32; do ifsym=constsym /* 收到常量声明符号,开头处理常量声明*/ getsymdo; do constdeclarationdo&tx,lev,&dx; /*dx 的值会被constdeclaration 转变,使用指针 */ whilesym=comma getsymdo; constdeclarationdo&tx,lev,&dx; ifsym=semicolon getsymdo; else error5; /* 漏掉了逗号或者

31、分号 */ whilesym=ident; ifsym=varsym/* 收到变量声名符号,开头处理变量声名 */ getsymdo; do vardeclarationdo&tx,lev,&dx; 细心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 14 页,共 33 页 - - - - - - - - - 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -whilesym=comma getsymdo; vardeclarationdo&tx,lev,&dx; ifsym=semicolon getsymdo; else error5; whilesym=ident; whilesym=procsym/* 收到过程声名符号,开头处理过程声名 */ getsymdo; ifsym=ident enterprocedur,&tx,lev,&dx;/* 记录过程名字 */ getsymdo; e

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com