




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
南昌航空大学实验报告课程名称: 编译原理 实验名称: PL/O语言的语法分析过程BLOCK 班级: 07061213 姓名: 何沛浓 同组人: 指导教师评定: 签名: 实验二 PL/O语言的语法分析过程BLOCK一、 实验目的1. 为了更好的配合编译原理有关词法分析章节的教学2. 加深和巩固学生对于语法分析的了解和掌握3. 让学生进一步的认识PL/0语言的基础和简单的程序编写4. 使学生通过本实验能够初步的了解和掌握程序语法分析的整个过程5. 提高学生的上机和编程过程中处理具体问题的能力二、 实验要求1. 在做本实验之前要先阅读完总体的预备知识以及本实验相关的基础知识。2. 在编写和调试过程中出现的问题最好做一下记录。3. 阅读懂所给出的语法分析程序,然后进行改进。4. 在阅读懂所给出的语法分析程序后,老师将进行逐个的检查以及提问,然后给出成绩。三、 实验内容:1. 阅读所给出的语法分析程序(pl0_syntax.c),搞懂程序中每一个变量的含义,以及每一个过 程的作用,并在该过程中进行中文注释。2. 阅读完程序后,画出各过程的流程图。3. 在阅读懂所给出的语法分析程序后,将你对语法分析的理解写在实验报告上。四、实验代码1、pl0_syntax.c 文件程序:#include #include pl0.h#include string.hint block(int lev, int tx, bool* fsys) int i;int dx; /名字分配到的相对地址int tx0; /保留初始tx的值int cx0; /保留初始cx的值bool nxtlevsymnum; /开辟新的空间传递给下级函数dx=3;tx0=tx; /记录本层名字的初始位置tabletx.adr=cx;gendo(jmp, 0, 0);if(levlevmax)error(32);doif(sym=constsym) /收到常量声明符号,开始处理常量声明getsymdo;doconstdeclarationdo(&tx, lev, &dx); /dx的值会被改变,使用指针while (sym=comma) /句号 getsymdo;constdeclarationdo(&tx,lev,&dx);if(sym=semicolon)getsymdo;elseerror(5); while(sym=ident);if(sym=varsym) /收到变量声明符号,开始处理变量声明getsymdo;dovardeclarationdo(&tx,lev,&dx);while(sym=comma)getsymdo;vardeclarationdo(&tx,lev,&dx);if(sym=semicolon)getsymdo;elseerror(5);while(sym=ident);while(sym=procsym) /收到过程声明符号,开始处理过程声明getsymdo;if(sym=ident)enter(procedur, &tx,lev,&dx); /记录过程名字getsymdo;elseerror(4); /procedure后应为标志符if(sym=semicolon)getsymdo;elseerror(5); memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlevsemicolon=true;if(-1=block(lev+1,tx,nxtlev)return -1; /递归调用if(sym=semicolon)getsymdo;memcpy(nxtlev,statbegsys,sizeof(bool)*symnum);nxtlevident=true;nxtlevprocsym=true;testdo(nxtlev,fsys,6);elseerror(5); memcpy(nxtlev,statbegsys,sizeof(bool)*symnum);nxtlevident=true;nxtlevperiod=true;testdo(nxtlev,declbegsys,7);while(inset(sym,declbegsys); /直到没有声明符号codetabletx0.adr.a=cx; /开始生成当前过程代码tabletx0.adr=cx; /当前过程代码地址tabletx0.size=dx; /声明部分中美增加一条声明都会给dx增加1,声明部分已经结束,dx就是当前过程数据的sizecx0=cx; gendo(inte,0,dx); /生成分配内存代码if(tableswitch) /输出名字表printf(TABLE:n);if(tx0+1tx)printf(NULLn);for(i=tx0+1; iamax)error(31); num=0; gendo(lit, 0, num);getsymdo;elseif(sym=lparen) /因子为表达式getsymdo;memcpy(nxtlev, fsys, sizeof(bool)*symnum);nxtlevrparen=true;expressiondo(nxtlev, ptx, lev);if(sym=rparen)getsymdo;else error(22); testdo(fsys, facbegsys, 23); /因子后右非法符号 return 0;int condition(bool* fsys, int* ptx, int lev) /条件处理enum symbol relop;bool nxtlevsymnum;if(sym=oddsym) /准备按照odd运算处理getsymdo;expressiondo(fsys, ptx, lev);gendo(opr, 0, 6); else /逻辑表达式处理memcpy(nxtlev, fsys, sizeof(bool)*symnum);nxtleveql=true;nxtlevneq=true;nxtlevlss=true;nxtlevleq=true; nxtlevgtr=true;nxtlevgeq=true;expressiondo(nxtlev, ptx, lev);if(sym!=eql & sym!=neq & sym!=lss & sym!=leq & sym!=gtr & sym!=geq)error(20);elserelop=sym;getsymdo;expressiondo(fsys, ptx, lev);switch(relop) case eql:gendo(opr, 0, 8);break;case neq:gendo(opr, 0, 9);break;case lss:gendo(opr, 0, 10);break;case geq:gendo(opr, 0, 11);break;case gtr:gendo(opr, 0, 12);break;case leq:gendo(opr, 0, 13);break; return 0; 2、pl0.c 文件程序:#include #include pl0.h#include string.hint main() bool nxtlevsymnum; printf(Input pl/0 file?); scanf(%s, fname); fin=fopen(fname, r); if(fin) printf(List object code? (Y/N); scanf(%s,fname); listswitch=(fname0=y | fname0=Y); printf(List symbol table? (Y/N); scanf(%s, fname); tableswitch=(fname0=y | fname0=Y); fa1=fopen(fa1.tmp, w); fprintf(fa1, Input pl/0 file?); fprintf(fa1, %sn, fname); init(); err=0; cc=cx=ll=0; ch= ; if(-1!=getsym() fa=fopen(fa.tmp, w); fas=fopen(fas.tmp, w); addset(nxtlev, declbegsys, statbegsys, symnum); nxtlevperiod=true; if(-1=block(0,0,nxtlev) fclose(fa); fclose(fa1); fclose(fas); close(fin); printf(n); return 0; fclose(fa); fclose(fa1); fclose(fas); if(sym!=period) error(9); if(err=0) fa2=fopen(fa2.tmp, w); interpret(); fclose(fa2); else printf(Errors in pl/0 program); fclose(fin); else printf(Cant open file! n); printf(n); return 0; void init() /初始化 int i; for(i=0; i=255; i+) ssymi=nul; 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), end); 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; wsym8=readsym; wsym9=thensym;wsym10=varsym; wsym11=whilesym; wsym12=writesym; wsym13=elsesym;wsym14=repeatsym;wsym15=untilsym; wsym16=elsesym; /加入else strcpy(&(mnemoniclit0), lit); strcpy(&(mnemonicopr0), opr); strcpy(&(mnemoniclod0), lod); strcpy(&(mnemonicsto0), sto); strcpy(&(mnemoniccal0), cal); strcpy(&(mnemonicinte0), int); strcpy(&(mnemonicjmp0), jmp); strcpy(&(mnemonicjpc0), jpc); for(i=0; isymnum; i+) declbegsysi=false; statbegsysi=false; facbegsysi=false; declbegsysconstsym=true; declbegsysvarsym=true; declbegsysprocsym=true; statbegsysbeginsym=true; statbegsyscallsym=true; statbegsysifsym=true; statbegsyswhilesym=true; facbegsysident=true; facbegsysnumber=true; facbegsyslparen=true; int inset(int e, bool* s) return se; int addset(bool* sr, bool* s1, bool* s2, int n) int i; for(i=0; in; i+) sri=s1i|s2i; return 0; int subset(bool* sr, bool* s1, bool* s2, int n) int i; for(i=0; in; i+) sri=s1i&(!s2i); return 0; int mulset(bool* sr, bool* s1, bool* s2, int n) int i; for(i=0; in; i+) sri=s1i&s2i; return 0; void error(int n) /出错处理 char space81; memset(space, 32, 81); spacecc-1=0; printf(*%s!%dn, space, n); fprintf(fa1, *%s!%dn, space, n);err+; 3、pl0_gen.c 文件程序:#include #include pl0.h#include string.hvoid enter(enum object k, int* ptx, int lev, int* pdx) /入口 (*ptx) +; strcpy(table(*ptx).name, id); table(*ptx).kind=k; switch(k) case constant: if(num amax) error(31); num=0; table(*ptx).val=num; break; case variable: table(*ptx).level=lev; table(*ptx).adr=(*pdx); (*pdx)+; break; case procedur: table(*ptx).level=lev; break; int position(char* idt, int tx) /位置 int i; strcpy(, idt); i=tx; while(strcmp(,idt)!=0) i-; return i;void listcode(int cx0) /生成代码 int i; if(listswitch) for(i=cx0; icx; i+) printf(%d %s %d %dn, i, mnemoniccodei.f, codei.l, codei.a); fprintf(fa, %d %s %d %dn, i, mnemoniccodei.f, codei.l, codei.a); int gen(enum fct x, int y, int z) if(cx=cxmax) printf(Program too long); return -1; codecx.f=x; codecx.l=y; codecx.a=z; cx+; return 0;int test(bool* s1, bool* s2, int n) if(!inset(sym, s1) error(n); while(!inset(sym, s1) & (!inset(sym, s2) getsymdo; return 0;4、pl0_ininterpret.c 文件程序:#include #include pl0.h#include string.h#define
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国白茶行业发展监测及投资战略规划研究报告
- 推拿治疗学新题库及答案详解【有一套】
- 2025年房屋拆除工程拆除物回收与处置合作协议
- 2025年度金融行业代理记账与风险评估合同范本
- 2025版移动互联网应用(App)开发与推广咨询合同
- 2025版塔吊工高空作业安全防护劳务合同范本
- 2025年度水利工程混凝土泵送施工总承包合同范本
- 2025年人社部六种劳动合同范本应用指南
- 2025版水利工程应急物资储备劳务承包合同范本
- 2025年度桥梁施工进度管理与监理合同
- YY/T 0196-2005一次性使用心电电极
- YS/T 226.12-2009硒化学分析方法第12部分:硒量的测定硫代硫酸钠容量法
- GB/T 24218.3-2010纺织品非织造布试验方法第3部分:断裂强力和断裂伸长率的测定(条样法)
- 系统工程原理 - 国防科技大学信息系统与管理学院
- 华为IPD流程管理全部课件
- 当代世界社会主义现状课件
- 2021年唐山迁安市教师进城考试笔试试题及答案解析
- 《给排水科学与工程概论》全套教学课件
- 三菱变频器d700说明书
- 涉外导游英语口语实训教程整套课件完整版PPT教学教程最全电子讲义教案(最新)
- 新疆新昊诚保温材料有限公司年产万吨岩棉生产线项目可
评论
0/150
提交评论