编译原理实验

上传人:hs****ma 文档编号:511066512 上传时间:2022-10-10 格式:DOC 页数:9 大小:134KB
返回 下载 相关 举报
编译原理实验_第1页
第1页 / 共9页
编译原理实验_第2页
第2页 / 共9页
编译原理实验_第3页
第3页 / 共9页
编译原理实验_第4页
第4页 / 共9页
编译原理实验_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《编译原理实验》由会员分享,可在线阅读,更多相关《编译原理实验(9页珍藏版)》请在金锄头文库上搜索。

1、华北科技学院计算机学院综合性实验实 验 报 告 课程名称 编译原理 实验学期 2015 至 2016 学年 第 二 学期学生所在院部 计算机学院 年级 2013 专业班级 计科B 学生姓名 学号 201307014 任课教师 王养廷 实验成绩 计算机学院制开课实验室:软件开发实验室 2016 年 5月 18日实验题目分析中间代码生成程序一、实验目的分析PL/0编译程序的总体结构、代码生成的方法和过程;具体写出一条语句的中间代码生成过程。二、设备与环境PC兼容机、Windows操作系统、Turbo Pascal软件等。三、实验内容1. 分析PL/0程序的Block子程序,理清PL/0程序结构和语

2、句格式。画出Block子程序的流程图,写出至少两条PL/0程序语句的语法格式。2. 分析PL/0程序的Block子程序和Gen子程序,了解代码生成的方法和过程。使用概要算法来描述语句的代码生成过程。3. 自己编写一个简单的PL/0程序,能够正确通过编译,得到中间代码。列出自己编写的源程序和编译后得到的中间代码。4. 从中选择一个语句或表达式,写出代码生成的过程。要求从自己的源程序中选择一条语句,结合这条语句写出语义分析和代码生成过程。在描述这个过程中,要说清楚每个功能有哪个子程序的哪条语句来完成,说清楚语句和参数的含义和功能。四、实验结果及分析(一)程序标注(常量声明处理过程constdecl

3、aration *) procedure constdeclaration; begin if sym = ident then/ 常量声明过程开始遇到的第一个符号必然应为标识符 begin getsym; if sym in eql, becomes then/如果是等号或赋值号 begin if sym = becomes/如果是赋值号(常量生明中应该是等号) then error(1); getsym;/ 获取下一个token, 等号或赋值号后应接上数字 if sym = number then/如果的确是数字 begin enter(constant);/ 把这个常量登陆到符号表 ge

4、tsym/获取下一个token,为后面作准备 end else error(2)/ 如果等号后接的不是数字,抛出2号错误 end else error(3)/ 如果常量标识符后接的不是等号或赋值号,抛出3号错误 end else error(4)/ 如果常量声明过程遇到的第一个符号不为标识符,抛出4号错误 end constdeclaration; (* 变量声明过程vardeclaration *) procedure vardeclaration; begin if sym = ident then/ 变量声明过程vardeclaration begin enter(varible); 将

5、标识符登陆到符号表中/ getsym end else error(4)/ 如果变量声明过程遇到的第一个符号不是标识符,抛出4号错误 end vardeclaration;(二)过程说明说明入口参数,返回值和过程的功能1、入口参数:过程体入口时的处理codetabletx0.adr.a:=cx;(cx为过程入口地址,填写在code中)with tabletx0 dobeginadr:=cx; (过程的入口填写在table表的过程名中)size:=dx; (过程需要的空间填写在table中)end;cxo:=cx; (保留过程在code中的入口地址在输出目标代码时用)gen(int,0,dx);

6、(生成过程入口指令)2、返回值:(* 通过静态链求出数据区基地址的函数base *) (* 参数说明:l:要求的数据区所在层与当前层的层差 *) (* 返回值:要求的数据区基址 *) function base(l: integer): integer; var b1: integer; begin b1 := b; (* find base 1 level down *) (* 首先从当前层开始 *) while l 0 do (* 如果l大于0,循环通过静态链往前找需要的数据区基址 *) begin b1 := sb1; (* 用当前层数据区基址中的内容(正好是静态链SL数据,为上一层的基

7、址)的作为新的当前层,即向上找了一层 *) l := l - 1 (* 向上了一层,l减一 *) end; base := b1 (* 把找到的要求的数据区基址返回 *) end(* base *);(三)程序静态结构图(四)PL0文法描述在计算机科学中,文法是编译原理的基础,是描述一门程序设计语言和实现其编译器的方法。文法的描述多用BNF(巴克斯范式),而另一个重要的概念:正则表达式,也是文法的另一种形式。PL/0文法的表示::= .:= := const,;:= =:= := |:= var, ;:= ;:= procedure;:= | := := := +|-:= := | ( ) :

8、= +|-:= *|/:= |odd:= =|=:= ifthen:= whiledo := call := begin;end:= read ( , ) := write ( , ) := a|b|c|d.x|y|z := 0|1|2|3.8|9(五)代码生成程序说明对分程序体入口的处理(见程序文本block 的过程体) begin (*block*) dx:=3; tx0:=tx; (*保留当前table表指针值,实际为过程名在table表中的位置*) tabletx.adr:=cx;(*保留当前code指针值到过程名的adr域*) gen(jmp,0,0);(*生成转向过程体入口的指令,

9、该指令的地址为cx已保留在过程名的adr域,真正的过程体入口地址,等生成过程体入口的指令时,再由tabletx.adr中取出 cx将过程体入口返填到cx所指目标代码,即:(jmp,0,0)的第3区域,同时填到tabletx.adr 中*)过程体入口时的处理codetabletx0.adr.a:=cx;(cx为过程入口地址,填写在code中)with tabletx0 dobeginadr:=cx; (过程的入口填写在table表的过程名中)size:=dx; (过程需要的空间填写在table中)end;cxo:=cx; (保留过程在code中的入口地址在输出目标代码时用)gen(int,0,d

10、x);(生成过程入口指令)table表格管理(六)代码生成程序实例给出pl0源程序,中间代码和过程说明编写代码:const x=4;var a,b;procedure try;begin b:=a*x-x;end;begin a:=5; call try;end.运行程序如图:五、实验总结这次实验让我学到了许多,通过运行THPL0CAI程序,掌握了符号表的建立过程,及运行过程中运行栈的变化过程。了解了PL/0语言是PASCAL语言的子集和指令功能表.但是在编码过程中暴露的问题是我们今后需要改进的地方,我相信认识到了问题所在,今后努力的方向才会更明确,才会更好的提高自己的水平。实践出真知,平时学习的仅限于书本知识,只会做几道题目,只有真的应用于实践中,才明白原来它的原理是这样的,而这些细节也在一步一步的调试过程中明了。教 师 评 价评定项目ABCD评定项目ABCD算法正确流程图正确语句语法格式正确源程序正确中间代码正确分析过程正确报告规范回答问题正确实验结果正确题解正确其他:评价教师签名:年 月 日

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号