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