广工编译原理实验报告
- 格式:doc
- 大小:566.50 KB
- 文档页数:17
<> 课实验报告 项目名称 PL/0编译器 学 院____ 计算机学院_______ 专 业_ _ 年级班别________ 学 号 _ 学生_______ ___ 辅导教师_______ 成 绩_______ _______
目录 一、课实验的容------------------------------------------4 二、实验修改部分--------------------------------------------4 三、概述-------------------------------------------------11 四、结构设计说明-------------------------------------------11 五、各功能模块描述-----------------------------------------14 六、主要成份描述------------------------------------------14 七、测试用例----------------------------------------------16 八、开发过程和完成情况--------------------------------------21
一、课实验的容 对PL/0作以下修改扩充: (1)增加单词:保留字 ELSE,FOR, STEP,RETURN 运算符 +=,-=,++,--,&,|,~ (2)修改单词:不等号# 改为 <> (3)增加条件语句的ELSE子句
二、实验修改部分: 1、增加四个保留字和七个运算符,共十一个单词。 修改部分:#define symnum 43 //保留字从32增加到43个
2、增加五个保留字:ELSE,FOR,STEP,RETURN ○1头文件pl0.h enum symbol { 新增加单词: elsesym, forsym, stepsym,returnsym, pluseq/* += */,plusone/* ++ */,plus/* + */,minuseq/* -= */,minusone/* -- */,minus/* - */,and,or,not} ○2头文件pl0.h
#define norw 24 //关键字从13增加到24个 ○3PL0.cpp
init(); 新增加:(增加后数组的容要再次根据字母顺序重新排列) strcpy(&(word[0][0]),"begin"); strcpy(&(word[1][0]),"call"); strcpy(&(word[2][0]),"const"); strcpy(&(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.cpp getsym(); 增加对+,-,++,--,+=,-=的识别; Statement(); 增加对+,-,++,--,-=的语句的处理; ○1Init()中改动:
ssym[‘&’]=and; ssym[‘|’]=or; ssym[‘~’]=not; facbegsys[plusone]=true; // 添加前自加运算 facbegsys[minusone]=true;// 添加前自减运算
○2Getsym()增加的容:
int getsym() { int i,j,k; while( ch==' '||ch==10||ch==9) { getchdo; } if(ch>='a'&&ch<='z') { k=0; do{ if(k='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-1>j) { 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(k>nmax) { error(30); } } else { if(ch==':') /*检测赋值符号*/ { getchdo; if(ch=='=') { sym=becomes; getchdo; } else { sym=nul; /*不能识别的符号*/ } } else { if(ch=='<') /*检测小于或小于等于符号*/ { getchdo; if(ch=='=') { sym=leq; getchdo; } else { sym=lss; } } else if(ch=='>') /*检测大于或大于等于符号*/ { getchdo; if(ch=='=') { sym=geq; getchdo; } else { sym=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=minuseq; getchdo; } else if(ch=='-') {
sym=minusone; getchdo; } else { sym=minus; } } /*这里之间为添加的容*/ else{
sym=ssym[ch];/* 当符号不满足上述条件时,全部按照单字符号处理*/ //getchdo; //richard
if(sym!=period) { getchdo; } //end richard } } } }
return 0; }
○3Statement()增加的容:(将本来“if(sym==becomes)……”部分的容修改为处理++,+=,--,-=),并在Statement()中定义变量int sym2; 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) {
gendo(opr,0,3); gendo(sto,lev-table[i].level,table[i].adr); }