资源描述:
《编译原理pL0实验报告.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、一.课程设计要求基本内容:(1)扩充赋值运算:*=和/=(2)扩充语句(Pascal的FOR语句):①FOR<变量>:=<表达式>TO<表达式>DO<语句>②FOR<变量>:=<表达式>DOWNTO<表达式>DO<语句>其中,语句①的循环变量的步长为2,语句②的循环变量的步长为-2。二.设计思路在课内实验的基础上,额外增加*=和/=运算符和关键字的语义动作,以下是设计思路:1.扩充单词在头文件pl0.h中的enumsymbol中增加关键字forsym,tosym,downtosym,timeseqlsym,slasheqlsym,并修改关键字数#definesymnum46。/*
2、初始化*///ssym['*=']=timeseql;//ssym['/=']=slasheql;/*设置保留字名字,按照字母顺序,便于折半查找*/strcpy(&(word[14][0]),"to");/*增加后需要按序排列*/strcpy(&(word[7][0]),"for");strcpy(&(word[4][0]),"downto");strcpy(&(word[3][0]),"do");/*设置保留字符号*/wsym[7]=forsym;wsym[14]=tosym;/*语法分析,获取一个符号*/在getsym()部分添加:elseif(ch=='*'){/**“*=
3、”**/getchdo;if(ch=='='){sym=timeseql;getchdo;printf("check*=success!");}elsesym=times;}elseif(ch=='/'){/*“/=”*/getchdo;if(ch=='='){sym=slasheql;getchdo;printf("check/=success!");}elsesym=slash;}/*其中printf部分均为识别成功后用作返回的信息而设*/2.扩充赋值运算符:*=和/=,关键字For①EBNF范式的书写:<变量>*=
4、/=<表达式>::=for<变量>:=<表达
5、式>to<表达式>do<语句>::=for<变量>:=<表达式>downto<表达式>do<语句>②语法描述图:a.*=和/=:语句Ident:=/=*=表达式①递归下降子程序a.增加+=,/=;找到statement部分的becomes部分作为修改:/以下为连接become语句后的修改部分*/elseif(sym==timeseql){getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);expressiondo(nxtlev,ptx,lev);gendo(lod,lev-table[i].level,table[i].
6、adr);gendo(opr,0,4);gendo(sto,lev-table[i].level,table[i].adr);}elseif(sym==slasheql){getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);gendo(lod,lev-table[i].level,table[i].adr);expressiondo(nxtlev,ptx,lev);gendo(opr,0,5);gendo(sto,lev-table[i].level,table[i].adr);}}}}b.增加for:找到statement部分的ca
7、lsym部分后作为增加:/以下为连接callsym语句后的增加部分*/elseif(sym==forsym){getsymdo;if(sym==ident){i=position(id,*ptx);if(i==0){error(11);}else{if(table[i].kind!=variable){error(12);i=0;}else{getsymdo;if(sym==becomes){getsymdo;}else{error(13);}memcpy(nxtlev,fsys,sizeof(bool)*symnum);expressiondo(nxtlev,ptx,lev);
8、if(i!=0){gendo(sto,lev-table[i].level,table[i].adr);}}}}if(sym==tosym){getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[dosym]=true;/*后跟符号为do*/cx1=cx;/*保存判断条件超作的位置*/gendo(lod,lev-table[i].level,table[i].adr);expressiondo(nxtlev,ptx,lev