《广工编译原理实验报告》由会员分享,可在线阅读,更多相关《广工编译原理实验报告(17页珍藏版)》请在金锄头文库上搜索。
1、课内实验报告 项目名称 PL/0编译器 学 院_ 计算机学院_专 业_ _年级班别_学 号 _学生姓名_ _辅导教师_成 绩_ _目录一、课内实验的内容-4二、实验修改部分-4三、概述-11四、结构设计说明-11五、各功能模块描述-14六、主要成份描述-14七、测试用例-16八、开发过程和完成情况-21一、课内实验的内容对PL/0作以下修改扩充:(1)增加单词:保留字 ELSE,FOR, STEP,RETURN运算符 +=,-=,+,-,&,|,(2)修改单词:不等号# 改为 (3)增加条件语句的ELSE子句二、实验修改部分:1、增加四个保留字和七个运算符,共十一个单词。修改部分:#defin
2、e symnum 43 /保留字从32增加到43个2、增加五个保留字:ELSE,FOR,STEP,RETURN头文件pl0.henum symbol 新增加单词: elsesym, forsym, stepsym,returnsym, pluseq/* += */,plusone/* + */,plus/* + */,minuseq/* -= */,minusone/* - */,minus/* - */,and,or,not头文件pl0.h#define norw 24 /关键字从13增加到24个PL0.cppinit();新增加:(增加后数组的内容要再次根据字母顺序重新排列) strcpy
3、(&(word00),begin);strcpy(&(word10),call);strcpy(&(word20),const);strcpy(&(word30),do);strcpy(&(word40),else); /*增加单词:保留字else*/ strcpy(&(word50),end); strcpy(&(word60),for); /*增加单词:保留字 for*/strcpy(&(word70),if); strcpy(&(word80),odd);strcpy(&(word90),procedure);strcpy(&(word100),read); strcpy(&(word1
4、10),return);/*增加单词:保留字 return*/strcpy(&(word120),step); /*增加单词:保留字step*/strcpy(&(word130),then);strcpy(&(word140),while); strcpy(&(word150),write); wsym0=beginsym; wsym1=callsym; wsym2=constsym; wsym3=dosym; wsym4=elsesym; /*else*/ wsym5=endsym; wsym6=forsym; /*for*/ wsym7=ifsym; wsym8=oddsym; wsym9
5、=procsym; wsym10=readsym; wsym11=returnsym; /*return*/ wsym12=stepsym; /*step*/ wsym13=thensym; wsym14=whilesym; wsym15=writesym;3、增加四个运算符 :+=,-=,+,- , l PL0.cppgetsym();增加对+,-,+,-,+=,-=的识别; Statement(); 增加对+,-,+,-,-=的语句的处理;Init()中改动:ssym&=and;ssym|=or;ssym=not;facbegsysplusone=true; / 添加前自加运算facbeg
6、sysminusone=true;/ 添加前自减运算Getsym()增加的内容:17int getsym()int i,j,k;while( ch= |ch=10|ch=9)getchdo;if(ch=a&ch=z) k=0;doif(k=a&ch=0&ch=9);ak=0;strcpy(id,a);i=0;j=norw-1;dok=(i+j)/2;if(strcmp(id,wordk)=0)i=k+1;while(ij)sym=wsymk;elsesym=ident;elseif(ch=0&ch=0&chnmax)error(30);elseif(ch=:) /*检测赋值符号*/getchd
7、o;if(ch=)sym=becomes;getchdo;elsesym=nul; /*不能识别的符号*/elseif(ch=) /*检测大于或大于等于符号*/ getchdo;if(ch=)sym=geq;getchdo;elsesym=gtr;/*这里之间为添加的内容*/else if(ch=+)/*检测+,+=,+符号*/getchdo;if(ch=) sym=pluseq;getchdo;else if(ch=+) sym=plusone; getchdo;else sym=plus;else if(ch=-)/*检测-,-=,-符号*/getchdo;if(ch=)sym=minus
8、eq;getchdo;else if(ch=-)sym=minusone;getchdo;else sym=minus;/*这里之间为添加的内容*/elsesym=ssymch;/* 当符号不满足上述条件时,全部按照单字符号处理*/getchdo;/richardif(sym!=period)getchdo;/end richardreturn 0;Statement()增加的内容:(将本来“if(sym=becomes)”部分的内容修改为处理+,+=,-,-=),并在Statement()中定义变量int sym2; if(sym=becomes|sym=pluseq|sym=minuseq|sym=plusone|sym=minusone) sym2=sym; getsymdo;gendo(lod,lev-tablei.level,tablei.adr); else error(13); if(sym2=plusone|sym2=minusone)/* 准备按照a+、a-语句处理,与read类似*/ if(i!=0)