编译原理pL0实验报告(共11页)_第1页
编译原理pL0实验报告(共11页)_第2页
编译原理pL0实验报告(共11页)_第3页
编译原理pL0实验报告(共11页)_第4页
编译原理pL0实验报告(共11页)_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上一. 课程设计要求基本内容:(1)扩充赋值运算:*= 和 /=(2)扩充语句(Pascal的FOR语句):FOR <变量>:=<表达式> TO <表达式> DO <语句>FOR <变量>:=<表达式> DOWNTO <表达式> DO <语句> 其中,语句的循环变量的步长为2,语句的循环变量的步长为-2。二设计思路在课内实验的基础上,额外增加*=和/=运算符和关键字的语义动作,以下是设计思路:1. 扩充单词 在头文件pl0.h中的enum symbol中增加关键字forsym

2、, tosym, downtosym, timeseqlsym, slasheqlsym,并修改关键字数#define symnum 46。/*初始化*/ssym'*='=timeseql;/ssym'/='=slasheql;/*设置保留字名字,按照字母顺序,便于折半查找*/strcpy(&(word140),"to"); /*增加后需要按序排列*/strcpy(&(word70),"for");strcpy(&(word40),"downto");strcpy(&(w

3、ord30),"do");/*设置保留字符号*/wsym7=forsym;wsym14=tosym;/*语法分析,获取一个符号*/在getsym()部分添加:else if(ch='*') /* “*=” */getchdo;if(ch='=')sym=timeseql;getchdo;printf("check *= success!");else sym=times; else if(ch='/') /* “/=” */getchdo;if(ch='=')sym=slasheql;get

4、chdo;printf("check /= success!"); else sym=slash; /*其中printf部分均为识别成功后用作返回的信息而设*/2. 扩充赋值运算符:*=和/=,关键字For EBNF范式的书写:<变量>*=|/=<表达式><for 语句>:=for<变量>:=<表达式> to <表达式> do <语句><for 语句>:=for<变量>:=<表达式> downto <表达式> do <语句> 语法描

5、述图:*=和/=:语句Ident:=/=*=表达式 递归下降子程序a.增加+=,/=;找到statement部分的becomes部分作为修改:/以下为连接become语句后的修改部分*/else if(sym=timeseql) getsymdo; memcpy(nxtlev,fsys,sizeof(bool)* symnum); expressiondo(nxtlev,ptx,lev); gendo(lod,lev-tablei.level,tablei.adr); gendo(opr,0,4); gendo(sto,lev-tablei.level,tablei.adr);else if(

6、sym=slasheql) getsymdo; memcpy(nxtlev,fsys,sizeof(bool)* symnum); gendo(lod,lev-tablei.level,tablei.adr); expressiondo(nxtlev,ptx,lev); gendo(opr,0,5); gendo(sto,lev-tablei.level,tablei.adr); b增加for: 找到statement部分的calsym部分后作为增加:/以下为连接callsym语句后的增加部分*/ elseif(sym=forsym)getsymdo;if(sym=ident) i=posit

7、ion(id,*ptx); if(i=0) error(11); else if(tablei.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); if(i!=0) gendo(sto,lev-tablei.level,tablei.adr); if(sym=tosym)getsymdo;memcpy(nxtlev,fsys,s

8、izeof(bool)*symnum);nxtlevdosym=true;/*后跟符号为do*/cx1=cx; /*保存判断条件超作的位置*/gendo(lod,lev-tablei.level,tablei.adr);expressiondo(nxtlev,ptx,lev);gendo(opr,0,13);cx2=cx; /*保存循环体的结束的下一个位置*/gendo(jpc,0,0);/*生成条件跳转,但跳出循环的地址未知*/if(sym=dosym)getsymdo;elseerror(18); /*缺少do*/statementdo(fsys,ptx,lev); /*循环体*/gend

9、o(lod,lev-tablei.level,tablei.adr); gendo(lit,lev-tablei.level,2);gendo(opr,0,2);gendo(sto,lev-tablei.level,tablei.adr);gendo(jmp,0,cx1);/*回头重新判断条件*/codecx2.a=cx; /*反填跳出循环的地址,与if类似*/else if(sym=downtosym) getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlevdosym=true;/*后跟符号为do*/cx1=cx; /*保存判断条件超

10、作的位置*/gendo(lod,lev-tablei.level,tablei.adr);expressiondo(nxtlev,ptx,lev); gendo(opr,0,11); cx2=cx; /*保存循环体的结束的下一个位置*/ gendo(jpc,0,0);/*生成条件跳转,但跳出循环的地址未知*/ if(sym=dosym) getsymdo;statementdo(fsys,ptx,lev); /*循环体*/ else error(18); /*缺少do*/ gendo(lod,lev-tablei.level,tablei.adr); gendo(lit,lev-tablei.

11、level,2); gendo(opr,0,3); gendo(sto,lev-tablei.level,tablei.adr); gendo(jmp,0,cx1);/*回头重新判断条件*/ codecx2.a=cx; /*反填跳出循环的地址,与if类似*/c. 生成的pcode代码:1 int 0 82 lit 0 53 sto 0 34 lit 0 55 sto 0 46 lit 0 17 sto 0 78 lod 0 79 lit 0 1010 opr 0 1311 jpc 0 2112 lod 0 313 lit 0 114 opr 0 215 sto 0 316 lod 0 717

12、lit 0 218 opr 0 219 sto 0 720 jmp 0 821 lod 0 322 opr 0 1423 opr 0 1524 lit 0 1825 sto 0 726 lod 0 727 lit 0 128 opr 0 1129 jpc 0 3930 lod 0 431 lit 0 132 opr 0 233 sto 0 434 lod 0 735 lit 0 236 opr 0 337 sto 0 738 jmp 0 2639 lod 0 440 opr 0 1441 opr 0 1542 opr 0 0start pl03. 测试用例的编写和运行结果:本次测试使用了三个测试用例,其中E02.PL0为检测是否能正确识别所增加的关键字和运算符,E04.PL0就是检测*=和/=是否能正确符合运算规则并求出得数,E05.PL0是for语句的检测。以下是实验截图:测试结果:计算结果为:a=44,b=6,运行结果正确。测试结果:计算结果为:a=10,b=14,运行结果正确。三、 心得 课程设计的实验难度不比课内实验,它要求我们掌握语言和动作,还要明白当中每一句语言所表达的含义和实现的内容

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论