您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 广工编译原理实验报告
1编译原理课内实验报告项目名称PL/0编译器学院____计算机学院_______专业__年级班别________学号_学生姓名__________辅导教师_______成绩______________目录2一、课内实验的内容------------------------------------------4二、实验修改部分--------------------------------------------4三、概述-------------------------------------------------11四、结构设计说明-------------------------------------------11五、各功能模块描述-----------------------------------------14六、主要成份描述------------------------------------------14七、测试用例----------------------------------------------16八、开发过程和完成情况--------------------------------------21一、课内实验的内容对PL/0作以下修改扩充:(1)增加单词:保留字ELSE,FOR,STEP,RETURN运算符+=,-=,++,--,&,|,~(2)修改单词:不等号#改为(3)增加条件语句的ELSE子句二、实验修改部分:1、增加四个保留字和七个运算符,共十一个单词。修改部分:#definesymnum43//保留字从32增加到43个2、增加五个保留字:ELSE,FOR,STEP,RETURN○1头文件pl0.henumsymbol{新增加单词:elsesym,forsym,stepsym,returnsym,pluseq/*+=*/,plusone/*++*/,plus/*+*/,minuseq/*-=*/,minusone/*--*/,minus/*-*/,and,or,not}○2头文件pl0.h#definenorw24//关键字从13增加到24个○3PL0.cppinit();新增加:(增加后数组的内容要再次根据字母顺序重新排列)strcpy(&(word[0][0]),begin);strcpy(&(word[1][0]),call);strcpy(&(word[2][0]),const);3strcpy(&(word[3][0]),do);strcpy(&(word[4][0]),else);/*增加单词:保留字else*/strcpy(&(word[5][0]),end);strcpy(&(word[6][0]),for);/*增加单词:保留字for*/strcpy(&(word[7][0]),if);strcpy(&(word[8][0]),odd);strcpy(&(word[9][0]),procedure);strcpy(&(word[10][0]),read);strcpy(&(word[11][0]),return);/*增加单词:保留字return*/strcpy(&(word[12][0]),step);/*增加单词:保留字step*/strcpy(&(word[13][0]),then);strcpy(&(word[14][0]),while);strcpy(&(word[15][0]),write);wsym[0]=beginsym;wsym[1]=callsym;wsym[2]=constsym;wsym[3]=dosym;wsym[4]=elsesym;/*else*/wsym[5]=endsym;wsym[6]=forsym;/*for*/wsym[7]=ifsym;wsym[8]=oddsym;wsym[9]=procsym;wsym[10]=readsym;wsym[11]=returnsym;/*return*/wsym[12]=stepsym;/*step*/wsym[13]=thensym;wsym[14]=whilesym;wsym[15]=writesym;3、增加四个运算符:+=,-=,++,--,∧,∨,┓PL0.cppgetsym();增加对+,-,++,--,+=,-=的识别;Statement();增加对+,-,++,--,-=的语句的处理;○1Init()中改动:ssym[‘&’]=and;ssym[‘|’]=or;ssym[‘~’]=not;facbegsys[plusone]=true;//添加前自加运算facbegsys[minusone]=true;//添加前自减运算○2Getsym()增加的内容:intgetsym(){4inti,j,k;while(ch==''||ch==10||ch==9){getchdo;}if(ch='a'&&ch='z'){k=0;do{if(kal){a[k]=ch;k++;}getchdo;}while(ch='a'&&ch='z'||ch='0'&&ch='9');a[k]=0;strcpy(id,a);i=0;j=norw-1;do{k=(i+j)/2;if(strcmp(id,word[k])=0){j=k-1;}if(strcmp(id,word[k])=0){i=k+1;}}while(i=j);if(i-1j){sym=wsym[k];}else{sym=ident;}}else{if(ch='0'&&ch='9'){k=0;num=0;sym=number;do{num=10*num+ch-'0';k++;getchdo;}while(ch='0'&&ch='9');/*获取数字的值*/k--;if(knmax){error(30);}}else{if(ch==':')/*检测赋值符号*/{getchdo;if(ch=='='){sym=becomes;getchdo;}else{sym=nul;/*不能识别的符号*/}}else{5if(ch=='')/*检测小于或小于等于符号*/{getchdo;if(ch=='='){sym=leq;getchdo;}else{sym=lss;}}elseif(ch=='')/*检测大于或大于等于符号*/{getchdo;if(ch=='='){sym=geq;getchdo;}else{sym=gtr;}}/*这里之间为添加的内容*/elseif(ch=='+'){/*检测+,+=,++符号*/getchdo;if(ch=='='){sym=pluseq;getchdo;}elseif(ch=='+'){sym=plusone;getchdo;}else{sym=plus;}}elseif(ch=='-'){/*检测-,-=,--符号*/getchdo;if(ch=='='){sym=minuseq;getchdo;}elseif(ch=='-'){sym=minusone;getchdo;}else{sym=minus;}}/*这里之间为添加的内容*/else{sym=ssym[ch];/*当符号不满足上述条件时,全部按照单字符号处理*///getchdo;//richardif(sym!=period){getchdo;}//endrichard}}}}6return0;}○3Statement()增加的内容:(将本来“if(sym==becomes)……”部分的内容修改为处理++,+=,--,-=),并在Statement()中定义变量intsym2;if(sym==becomes||sym==pluseq||sym==minuseq||sym==plusone||sym==minusone){sym2=sym;getsymdo;gendo(lod,lev-table[i].level,table[i].adr);}else{error(13);}if(sym2==plusone||sym2==minusone)/*准备按照a++、a--语句处理,与read类似*/{if(i!=0){if(sym2==plusone){gendo(lit,0,1);gendo(opr,0,2);gendo(sto,lev-table[i].level,table[i].adr);}if(sym2==minusone){gendo(lit,0,1);gendo(opr,0,3);gendo(sto,lev-table[i].level,table[i].adr);}}}else{memcpy(nxtlev,fsys,sizeof(bool)*symnum);expressiondo(nxtlev,ptx,lev);if(i!=0){if(sym2==becomes)gendo(sto,lev-table[i].level,table[i].adr);if(sym2==pluseq){gendo(opr,0,2);gendo(sto,lev-table[i].level,table[i].adr);}if(sym2==minuseq){7gendo(opr,0,3);gendo(sto,lev-table[i].level,table[i].adr);}}}//else}}}4、修改单词:不等号#改为PL0.cppinit();移除:ssym['#']=neq;○1在getsym()里增加对的识别(在或=基础上修改)。下面为在基础上修改,注意在if(ch==’’)中修改,不包括elseif(ch=='')那部分:if(ch=='')/*检测小于或小于等于符号*/{getchdo;if(ch=='='){sym=leq;getchdo;}/*在之间添加*/elseif(ch=='')//addneq{sym=neq;getchdo;}/*在之间添加*/else{sym=lss;}}5、增加条件语句的ELSE子句PL0.cpp○1在statement()里的“if...then”语句处理的基础上添加对else子句的处理,使之能处理if……then……else……的语句。8else{if(sym==ifsym)/*准备按照if语句处理*/{getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[thensym]=true;nxtlev[dosym]=true;/*后跟符号为then或do*/conditiondo(nxtlev,ptx,lev);/*调用条件处理(逻辑运算)函数*/if(sym==thensym){getsymdo;}else{error(16);/*缺少then*/}cx1=cx;/*保存当前指令地址*/gendo(jpc,0,0);/*生成条件跳转指令,跳转地址暂写0*//*这里之间开始添加*/memcpy(nxtlev,fsys,sizeof(bool)*symnum);//添加后跟符号nxtlev[elsesym]=true;statementdo(nxtlev,ptx,lev);/*处理then后的语句*/code[cx1].a=cx;/*经statement处理后,cx为then后语句执行完的位置,它正是前面未定的跳转地址*/if(sym==elsesym){cx2=cx;getsymdo;gendo(jmp,0,0);code[cx1].a=cx;statementdo(fsys,ptx,lev);code[cx2].a=cx;}/*这里之间开始添加*/}else{if(sym==beginsym)/*准备按照复合语句处理*/{getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);9nxtlev[semicolon]=true;nx
本文标题:广工编译原理实验报告
链接地址:https://www.777doc.com/doc-5380036 .html