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

上传人:b****4 文档编号:6337232 上传时间:2023-05-06 格式:DOCX 页数:20 大小:339.02KB
下载 相关 举报
华北科技学院编译原理pl0实验报告Word格式文档下载.docx_第1页
第1页 / 共20页
华北科技学院编译原理pl0实验报告Word格式文档下载.docx_第2页
第2页 / 共20页
华北科技学院编译原理pl0实验报告Word格式文档下载.docx_第3页
第3页 / 共20页
华北科技学院编译原理pl0实验报告Word格式文档下载.docx_第4页
第4页 / 共20页
华北科技学院编译原理pl0实验报告Word格式文档下载.docx_第5页
第5页 / 共20页
华北科技学院编译原理pl0实验报告Word格式文档下载.docx_第6页
第6页 / 共20页
华北科技学院编译原理pl0实验报告Word格式文档下载.docx_第7页
第7页 / 共20页
华北科技学院编译原理pl0实验报告Word格式文档下载.docx_第8页
第8页 / 共20页
华北科技学院编译原理pl0实验报告Word格式文档下载.docx_第9页
第9页 / 共20页
华北科技学院编译原理pl0实验报告Word格式文档下载.docx_第10页
第10页 / 共20页
华北科技学院编译原理pl0实验报告Word格式文档下载.docx_第11页
第11页 / 共20页
华北科技学院编译原理pl0实验报告Word格式文档下载.docx_第12页
第12页 / 共20页
华北科技学院编译原理pl0实验报告Word格式文档下载.docx_第13页
第13页 / 共20页
华北科技学院编译原理pl0实验报告Word格式文档下载.docx_第14页
第14页 / 共20页
华北科技学院编译原理pl0实验报告Word格式文档下载.docx_第15页
第15页 / 共20页
华北科技学院编译原理pl0实验报告Word格式文档下载.docx_第16页
第16页 / 共20页
华北科技学院编译原理pl0实验报告Word格式文档下载.docx_第17页
第17页 / 共20页
华北科技学院编译原理pl0实验报告Word格式文档下载.docx_第18页
第18页 / 共20页
华北科技学院编译原理pl0实验报告Word格式文档下载.docx_第19页
第19页 / 共20页
华北科技学院编译原理pl0实验报告Word格式文档下载.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

《华北科技学院编译原理pl0实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《华北科技学院编译原理pl0实验报告Word格式文档下载.docx(20页珍藏版)》请在冰点文库上搜索。

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

2、pl0主要文法结构:

〈程序〉∷=〈分程序〉.

〈分程序〉∷=[〈常量说明部分〉][〈变量说明部分〉][〈过程说明部分〉]〈语句〉

〈常量说明部分〉∷=CONST〈常量定义〉{,〈常量定义〉};

〈常量定义〉∷=〈标识符〉=〈无符号整数〉

〈无符号整数〉∷=〈数字〉{〈数字〉}

〈变量说明部分〉∷=VAR〈标识符〉{,〈标识符〉};

〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉}

〈过程说明部分〉∷=〈过程首部〉〈分程序〉{;

〈过程说明部分〉};

〈过程首部〉∷=PROCEDURE〈标识符〉;

〈语句〉∷=〈赋值语句〉|〈条件语句〉|〈当型循环语句〉|

〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉

3、类pcode代码指令的结构:

(1)pl0主要指令集:

①LIT:

将常量值取到运行栈顶。

a域为常数值。

 ②LOD:

将变量放到栈顶。

a域为变量在所说明层中的相对位置,l为调用层与说明层的层差值。

 ③STO:

将栈顶的内容送入某变量单元中。

a,l域的含意同LOD指令。

 ④CAL:

调用过程的指令。

a为被调用过程的目标程序入口地址,l为层差。

 ⑤INT:

为被调用的过程(或主程序)在运行栈中开辟数据区。

a域为开辟的单元个数。

 ⑥JMP:

无条件转移指令,a为转向地址。

 ⑦JPC:

条件转移指令,当栈顶的布尔值为非真时,转向a域的地址,否则顺序执行。

 ⑧OPR:

关系运算和算术运算指令。

将栈顶和次栈顶的内容进行运算,结果存放在次栈顶,此外还可以是读写等特殊功能的指令,具体操作由a域值给出。

(2)pl0指令功能

LIT0a

将常数值取到栈顶,a为常数值

LODla

将变量值取到栈顶,a为偏移量,l为层差

STOla

将栈顶内容送入某变量单元中,a为偏移量,l为层差

CALla

调用过程,a为过程地址,l为层差

INT0a

在运行栈中为被调用的过程开辟a个单元的数据区

JMP0a

无条件跳转至a地址

JPC0a

条件跳转,当栈顶布尔值非真则跳转至a地址,否则顺序执行

OPR00

过程调用结束后,返回调用点并退栈

OPR01

栈顶元素取反

OPR02

次栈顶与栈顶相加,退两个栈元素,结果值进栈

OPR03

次栈顶减去栈顶,退两个栈元素,结果值进栈

OPR04

次栈顶乘以栈顶,退两个栈元素,结果值进栈

OPR05

次栈顶除以栈顶,退两个栈元素,结果值进栈

OPR06

栈顶元素的奇偶判断,结果值在栈顶

OPR07

OPR08

次栈顶与栈顶是否相等,退两个栈元素,结果值进栈

OPR09

次栈顶与栈顶是否不等,退两个栈元素,结果值进栈

OPR010

次栈顶是否小于栈顶,退两个栈元素,结果值进栈

OPR011

次栈顶是否大于等于栈顶,退两个栈元素,结果值进栈

OPR012

次栈顶是否大于栈顶,退两个栈元素,结果值进栈

OPR013

次栈顶是否小于等于栈顶,退两个栈元素,结果值进栈

OPR014

栈顶值输出至屏幕

OPR015

屏幕输出换行

OPR016

从命令行读入一个输入置于栈顶

4、PL/0编译程序的结构:

图1

图2

图3

图4

5、PL/0编译程序的词法分析:

图5

图6

6、PL/0编译程序的语法分析:

图7

图8

表2.2TABLE表中的信息

NAME

KIND

LEVEL/VAL

ADR

SIZE

TXo→

A

B

C

D

E

P

CONSTANT

VARIABLE

VARIABL

EPROCEDUR

35

49

LEV

DX

DX+1

DX+2

过程p的入口(待填)

4

TX→

VARIABLE 

LEV+1

ADR:

TABLE表的表头索引TX和层次单元LEV都以BLOCK的参数形式出现。

在主程序调用BLOCK时实参值都为0。

每个过程中变量的相对起始位置在BLOCK内置初值DX∶=3。

7、PL/0编译程序的目标代码结构和代码生成:

①对分程序体人口的处理(见程序文本block的过程体)

  begin(*block*)

   dx:

=3;

   tx0:

=tx;

(*保留当前table表指针值,实际为过程名在table表中的位置*)

   table[tx].adr:

=cx;

(*保留当前code指针值到过程名的adr域*)

   gen(jmp,0,0);

记录过程在code的入口到table中的adr域如下表所示:

图9

(*生成转向过程体入口的指令,该指令的地址为cx已保留在过程名的adr域,真正的过程体入口地址,等生成过程体入口的指令时,再由table[tx].adr中取出cx将过程体入口返填到cx所指目标代码,即:

(jmp,0,0)的第3区域,同时填到table[tx].adr中*)

②过程体入口时的处理

code[table[tx0].adr].a:

(cx为过程入口地址,填写在code中)

  withtable[tx0]do 

   begin 

    adr:

(过程的入口填写在table表的过程名中)

    size:

=dx;

(过程需要的空间填写在table中)

   end;

  cxo:

(保留过程在code中的入口地址在输出目标代码时用) 

  gen(int,0,dx);

(生成过程入口指令)

table表格管理

图10

8、PL/0编译程序的目标代码解释执行时的存储分配:

当源程序经过语法分析,如果未发现错误时,由编译程序调用解释程序,对存放在CODE中的目标代码CODE[0]开始进行解释执行。

当编译结束后,记录源程序中标识符的TABLE表已没有作用。

因为计算每个变量在运行栈中相对本过程基地址的偏移量dx的值,放在table表中的adr域,生成目标代码时再从adr域中取出基地址的偏移量,放在code中的a域。

因此数据空间只需以数组CODE存放的只读目标程序和运行时的数据栈S。

S是由解释程序定义的一维整型数组。

由于PL/0语言的目标程序是一种假想的栈式计算机的汇编语言,仍用PASCAL语言解释执行。

解释执行时的数据空间S为栈式计算机的存储空间。

遵循后进先出规则,对每个过程(包括主程序)当被调用时,才分配数据空间,退出过程时,则所分配的数据空间被释放。

变量在code[cx]、table[tx]和s[t]之间的信息联系 

图11

解释定义了4个寄存器

 

(1)I:

指令寄存器。

存放着当前正在解释的一条目标指令。

  

(2)P:

程序地址寄存器。

指向下一条要执行的目标程序的地址(相当目标程序CODE数组的下标)。

  (3)T:

栈顶寄存器。

由于每个过程当它被运行时,给它分配的数据空间(下边称数据段)可分成两部分。

  静态部分:

包括变量存放区和三个联系单元(联系单元的作用见后)。

  动态部分:

作为临时工作单元和累加器用。

需要时随时分配,用完后立即释放。

栈顶寄存器T指出了当前栈中最新分配的单元(T也是数组S的下标)。

  (4)B:

基址寄存器。

指向每个过程被调用时,在数据区S中给它分配的数据段起始地址,也称基地址。

  为了实现对每个过程调用时给它分配数据段,也就是对即将运行的过程所需数据段进栈;

过程运行结束后释放数据段,即该数据段退栈;

以及嵌套过程之间对标识符引用的寻址问题。

每个过程被调用时,在栈顶分配三个联系单元,这三个单元存放的内容分别为:

  

(1)SL:

静态链:

它是指向定义该过程的直接外过程(或主程序)运行时最新数据段的基地址。

  

(2)DL:

动态链:

它是指向调用该过程时正在运行过程的数据段基地址。

(3)RA:

返回地址:

记录调用该过程时目标程序的断点,即当时的程序地址寄存器P的值。

也就是调用过程指令的下一条指令的地址。

图12

例:

若有程序结构为:

 procedureA:

 …

   procedureB:

   …

     procedureC:

      程序体C

       …

       callB:

       …

    程序体B

    …

     callC:

     …

  程序体A

   …

   callB:

  …

 主程序

  callA:

  …

下面举例说明解释执行时数据区的变化过程,图2.10给出示意图。

图13运行时数据栈S的变化状态

图13

在图13中我们可以看到当例中程序执行进入到C过程后,在C过程中又调用B过程时,数据区栈中的状况,这时过程B的静态链是指向过程A的基地址,而不是指向过程C的基地址。

因为过程B是由过程A定义的,它的名字在A层的名字表中,当在C过程中调用B过程时,层次差为2,所以这时应沿C过程数据的静态链,跳过两个数据段的基地址值,才是当前被调用的B过程的静态链之值。

这里也可看出不管B过程在何时被调用,它的数据段静态链总是指向定义它的A过程的最新数据段基地址。

四、实验结果及分析

1、对源程序的修改:

由于源程序默认输出listcode,可能会影响查看代码调试结果,在源码中加入控制语句,用以选择listcode的输出。

1添加变量:

varch:

……

listswitch:

string;

switch:

boolean;

2添加控制语句的输入

begin{mainprogram}

writeln('

pleaseinputsourceprogramfilename:

'

);

readln(sfile);

assign(fin,sfile);

reset(fin);

ouputtheprogramlistcode(y/n):

//输入提示

readln(listswitch);

//接受输入

=('

y'

=listswitch[1])or('

Y'

=listswitch[1]);

//判断输入

end.

3添加控制语句

begin{block}

test(fsys,[],8);

ifswitchthenlistcode;

//添加控制语句

end{block};

2、测试代码:

constn=10;

varx,y,z;

proceduregetx;

begin

x:

=10;

whilex<

20dox:

=x+10;

end;

begin

callgetx;

y:

=5+5*5;

z:

=x+y+n;

3、编译运行:

1启动PL0-1编译器

图14

2编译运行源程序选择不输出listcode

图15

3编译运行源程序选择输出listcode

图16

4、实验心得

过认真阅读PL/0语言编译程序文本,加深理解一般编译程序构造的整体结构和实现的步骤,对词法、语法、语义分析、代码生成及符号表管理每个过程的功能和相互联系及实现技术。

联系实际做好作业和实验,巩固知识。

教师评价

评定项目

算法正确

界面美观,布局合理

程序结构合理

操作熟练

语法、语义正确

解析完整

实验结果正确

文字流畅

报告规范

题解正确

其他:

评价教师签名:

年月日

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

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

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