编译原理-分析报告材料中间代码生成程序

编译原理-分析报告材料中间代码生成程序

ID:28872522

大小:183.00 KB

页数:10页

时间:2018-12-14

编译原理-分析报告材料中间代码生成程序_第1页
编译原理-分析报告材料中间代码生成程序_第2页
编译原理-分析报告材料中间代码生成程序_第3页
编译原理-分析报告材料中间代码生成程序_第4页
编译原理-分析报告材料中间代码生成程序_第5页
资源描述:

《编译原理-分析报告材料中间代码生成程序》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、实用标准文案实验报告课程名称编译原理实验学期至学年第学期学生所在系部年级专业班级学生姓名学号任课教师实验成绩计算机学院制精彩文档实用标准文案开课实验室:年月日实验题目分析中间代码生成程序一、实验目的分析PL/0编译程序的总体结构、代码生成的方法和过程;具体写出一条语句的中间代码生成过程。二、设备与环境PC兼容机、Windows操作系统、TurboPascal软件等。三、实验内容1.分析PL/0程序的Block子程序,理清PL/0程序结构和语句格式。画出Block子程序的流程图,写出至少两条PL/0程序语句的语法格式。2.分析PL/0程序的Bl

2、ock子程序和Gen子程序,了解代码生成的方法和过程。使用概要算法来描述语句的代码生成过程。3.自己编写一个简单的PL/0程序,能够正确通过编译,得到中间代码。列出自己编写的源程序和编译后得到的中间代码。4.从中选择一个语句或表达式,写出代码生成的过程。要求从自己的源程序中选择一条语句,结合这条语句写出语义分析和代码生成过程。在描述这个过程中,要说清楚每个功能有哪个子程序的哪条语句来完成,说清楚语句和参数的含义和功能。四、实验结果及分析(一)程序标注levmax=3;{maxdepthofblocknesting}{最大允许的块嵌套层数}{语

3、法分析过程block}{参数:lev:这一次语法分析所在的层次}{tx:符号表指针}{fsys:用于出错恢复的单词集合}procedureblock(lev,tx:integer;fsys:symset);vardx:integer;{dataallocationindex}{数据段内存分配指针,指向下一个被分配空间在数据段中的偏移位置}tx0:integer;{initialtableindex}{记录本层开始时符号表位置}cx0:integer;{initialcodeindex}{记录本层开始时代码段分配位置}精彩文档实用标准文案{登陆

4、符号表过程enter}procedureenter(k:object1);begin{enterobjectintotable}{参数:k:欲登陆到符号表的符号类型}tx:=tx+1;{符号表指针指向一个新的空位}withtable[tx]do{开始登录}beginname:=id;{name是符号的名字,对于标识符,这里就是标识符的名字}kind:=k;{符号类型,可能是常量、变量或过程名}casekof{根据不同的类型进行不同的操作}constant:{如果是常量名}beginifnum>amaxthen{在常量的数值大于允许的最大值的情

5、况下}beginerror(31);{抛出31号错误}num:=0;{实际登陆的数字以0代替}end;val:=num{如是合法的数值,就登陆到符号表}end;variable:{如果是变量名}beginlevel:=lev;{记下它所属的层次号}adr:=dx;{记下它在当前层中的偏移量}dx:=dx+1;{偏移量自增一,为下一次做好准备}end;procedur:{如果要登陆的是过程名}level:=lev{记录下这个过程所在层次}EndEndend{enter};{登录符号过程没有考虑到重复的定义的问题。如果出现重复定义,则以最后一次的

6、定义为准。}{在符号表中查找指定符号所在位置的函数position}精彩文档实用标准文案{参数:id:要找的符号}{返回值:要找的符号在符号表中的位置,如果找不到就返回0}functionposition(id:alfa):integer;vari:integer;begin{findidentifierintable}table[0].name:=id;{先把id放入符号表0号位置}i:=tx;{从符号表中当前位置也即最后一个符号开始找}whiletable[i].name<>iddo{如果当前的符号与要找的不一致}i:=i–1;{找前面一

7、个}position:=i{返回找到的位置号,如果没找到则一定正好为0}end{position};(二)过程说明说明入口参数,返回值和过程的功能1、入口参数:过程体入口时的处理code[table[tx0].adr].a:=cx;(cx为过程入口地址,填写在code中)  withtable[tx0]do    begin     adr:=cx;(过程的入口填写在table表的过程名中)    size:=dx;(过程需要的空间填写在table中)   end;  cxo:=cx;(保留过程在code中的入口地址在输出目标代码时用)   

8、gen(int,0,dx);(生成过程入口指令)2、返回值:精彩文档实用标准文案(*通过静态链求出数据区基地址的函数base*)(*参数说明:l:要求的数据区所在层

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。