ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:339.02KB ,
资源ID:6337232      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-6337232.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(华北科技学院编译原理pl0实验报告Word格式文档下载.docx)为本站会员(b****4)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

华北科技学院编译原理pl0实验报告Word格式文档下载.docx

1、2、pl0主要文法结构:程序=分程序分程序=常量说明部分变量说明部分过程说明部分语句常量说明部分=CONST常量定义 ,常量定义;常量定义=标识符=无符号整数无符号整数=数字数字变量说明部分=VAR标识符,标识符;标识符=字母字母|数字过程说明部分=过程首部分程序;过程说明部分;过程首部=PROCEDURE标识符;语句=赋值语句|条件语句|当型循环语句|过程调用语句|读语句|写语句|复合语句|空 3、类pcode代码指令的结构:(1)pl0主要指令集: LIT:将常量值取到运行栈顶。a域为常数值。 LOD:将变量放到栈顶。a域为变量在所说明层中的相对位置,l为调用层与说明层的层差值。 STO:

2、将栈顶的内容送入某变量单元中。a,l域的含意同LOD指令。 CAL:调用过程的指令。a为被调用过程的目标程序入口地址,l为层差。 INT:为被调用的过程(或主程序)在运行栈中开辟数据区。a域为开辟的单元个数。 JMP:无条件转移指令,a为转向地址。 JPC:条件转移指令,当栈顶的布尔值为非真时,转向a域的地址,否则顺序执行。 OPR:关系运算和算术运算指令。将栈顶和次栈顶的内容进行运算,结果存放在次栈顶,此外还可以是读写等特殊功能的指令,具体操作由a域值给出。(2)pl0指令功能LIT 0 a将常数值取到栈顶,a为常数值LOD l a将变量值取到栈顶,a为偏移量,l为层差STO l a将栈顶内

3、容送入某变量单元中,a为偏移量,l为层差CAL l a调用过程,a为过程地址,l为层差INT 0 a在运行栈中为被调用的过程开辟a个单元的数据区JMP 0 a无条件跳转至a地址JPC 0 a条件跳转,当栈顶布尔值非真则跳转至a地址,否则顺序执行OPR 0 0过程调用结束后,返回调用点并退栈OPR 0 1栈顶元素取反OPR 0 2次栈顶与栈顶相加,退两个栈元素,结果值进栈OPR 0 3次栈顶减去栈顶,退两个栈元素,结果值进栈OPR 0 4次栈顶乘以栈顶,退两个栈元素,结果值进栈OPR 0 5次栈顶除以栈顶,退两个栈元素,结果值进栈OPR 0 6栈顶元素的奇偶判断,结果值在栈顶OPR 0 7OPR

4、 0 8次栈顶与栈顶是否相等,退两个栈元素,结果值进栈OPR 0 9次栈顶与栈顶是否不等,退两个栈元素,结果值进栈OPR 0 10次栈顶是否小于栈顶,退两个栈元素,结果值进栈OPR 0 11次栈顶是否大于等于栈顶,退两个栈元素,结果值进栈OPR 0 12次栈顶是否大于栈顶,退两个栈元素,结果值进栈OPR 0 13次栈顶是否小于等于栈顶,退两个栈元素,结果值进栈OPR 0 14栈顶值输出至屏幕OPR 0 15屏幕输出换行OPR 0 16从命令行读入一个输入置于栈顶4、PL/0编译程序的结构:图1图2图3图45、PL/0编译程序的词法分析:图5图66、PL/0编译程序的语法分析:图7图8表 2.2

5、 TABLE表中的信息NAMEKINDLEVEL/VALADRSIZETXoABCDEPCONSTANTVARIABLEVARIABLEPROCEDUR3549LEVDXDX+1DX+2过程p的入口(待填)4TXGVARIABLELEV+1ADR:TABLE表的表头索引TX和层次单元LEV都以BLOCK的参数形式出现。在主程序调用BLOCK时实参值都为0。每个过程中变量的相对起始位置在BLOCK内置初值DX=3。7、PL/0编译程序的目标代码结构和代码生成:对分程序体人口的处理(见程序文本block 的过程体) begin (*block*) dx:=3; tx0:=tx; (*保留当前tab

6、le表指针值,实际为过程名在table表中的位置*) tabletx.adr:=cx;(*保留当前code指针值到过程名的adr域*) gen(jmp,0,0);记录过程在code的入口到table中的adr域如下表所示:图9(*生成转向过程体入口的指令,该指令的地址为cx已保留在过程名的adr域,真正的过程体入口地址,等生成过程体入口的指令时,再由tabletx.adr中取出 cx将过程体入口返填到cx所指目标代码,即:(jmp,0,0)的第3区域,同时填到tabletx.adr 中*)过程体入口时的处理codetabletx0.adr.a:(cx为过程入口地址,填写在code中)with

7、tabletx0 dobeginadr: (过程的入口填写在table表的过程名中)size:=dx; (过程需要的空间填写在table中)end;cxo: (保留过程在code中的入口地址在输出目标代码时用)gen(int,0,dx);(生成过程入口指令)table表格管理图108、PL/0编译程序的目标代码解释执行时的存储分配:当源程序经过语法分析,如果未发现错误时,由编译程序调用解释程序,对存放在CODE中的目标代码CODE0开始进行解释执行。当编译结束后,记录源程序中标识符的TABLE表已没有作用。因为计算每个变量在运行栈中相对本过程基地址的偏移量dx 的值,放在table表中的adr

8、域,生成目标代码时再从adr域中取出基地址的偏移量 ,放在code中的a域。因此数据空间只需以数组CODE存放的只读目标程序和运行时的数据栈S。S是由解释程序定义的一维整型数组。由于PL/0语言的目标程序是一种假想的栈式计算机的汇编语言,仍用PASCAL语言解释执行。解释执行时的数据空间S为栈式计算机的存储空间。遵循后进先出规则,对每个过程(包括主程序)当被调用时,才分配数据空间,退出过程时,则所分配的数据空间被释放。变量在code cx 、tabletx和st之间的信息联系图11解释定义了4个寄存器 (1) I:指令寄存器。存放着当前正在解释的一条目标指令。 (2) P:程序地址寄存器。指向

9、下一条要执行的目标程序的地址(相当目标程序CODE数组的下标)。 (3) T:栈顶寄存器。由于每个过程当它被运行时,给它分配的数据空间(下边称数据段)可分成两部分。 静态部分:包括变量存放区和三个联系单元(联系单元的作用见后)。 动态部分:作为临时工作单元和累加器用。需要时随时分配,用完后立即释放。栈顶寄存器T指出了当前栈中最新分配的单元(T也是数组S的下标)。 (4) B:基址寄存器。指向每个过程被调用时,在数据区S中给它分配的数据段起始地址,也称基地址。 为了实现对每个过程调用时给它分配数据段,也就是对即将运行的过程所需数据段进栈;过程运行结束后释放数据段,即该数据段退栈;以及嵌套过程之间

10、对标识符引用的寻址问题。每个过程被调用时,在栈顶分配三个联系单元,这三个单元存放的内容分别为: (1) SL:静态链:它是指向定义该过程的直接外过程(或主程序)运行时最新数据段的基地址。 (2) DL:动态链:它是指向调用该过程时正在运行过程的数据段基地址。(3) RA:返回地址:记录调用该过程时目标程序的断点,即当时的程序地址寄存器P的值。也就是调用过程指令的下一条指令的地址。图12例:若有程序结构为: procedure A: procedure B: procedure C:程序体C call B: 程序体B call C:程序体Acall B: 主程序call A:下面举例说明解释执行

11、时数据区的变化过程,图2.10给出示意图。图13 运行时数据栈S的变化状态图13在图13中我们可以看到当例中程序执行进入到C过程后,在C过程中又调用B过程时,数据区栈中的状况,这时过程B的静态链是指向过程A的基地址,而不是指向过程C的基地址。因为过程B是由过程A定义的,它的名字在A层的名字表中,当在C过程中调用B过程时,层次差为2,所以这时应沿C过程数据的静态链,跳过两个数据段的基地址值,才是当前被调用的B过程的静态链之值。这里也可看出不管B过程在何时被调用,它的数据段静态链总是指向定义它的A过程的最新数据段基地址。四、实验结果及分析1、对源程序的修改:由于源程序默认输出listcode,可能

12、会影响查看代码调试结果,在源码中加入控制语句,用以选择listcode的输出。1添加变量:var ch: listswitch:string; switch:boolean;2添加控制语句的输入begin main program writeln(please input source program file name:); readln(sfile); assign(fin,sfile); reset(fin);ouput the program listcode (y/n): /输入提示 readln(listswitch); /接受输入=(y=listswitch1) or (Y=li

13、stswitch1); /判断输入end.3添加控制语句begin block test(fsys, , 8); if switch then listcode; /添加控制语句end block;2、测试代码:const n=10;var x,y,z; procedure getx; begin x:=10; while x20 do x:=x+10;end;begin call getx; y:=5+5*5; z:=x+y+n;3、编译运行:1启动PL0-1编译器图142编译运行源程序 选择不输出listcode图153编译运行源程序 选择输出listcode图164、实验心得过认真阅读PL/0语言编译程序文本,加深理解一般编译程序构造的整体结构和实现的步骤,对词法、语法、语义分析、代码生成及符号表管理每个过程的功能和相互联系及实现技术。联系实际做好作业和实验,巩固知识。教 师 评 价评定项目算法正确界面美观,布局合理程序结构合理操作熟练语法、语义正确解析完整实验结果正确文字流畅报告规范题解正确其他:评价教师签名:年 月 日

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2