当前位置:首页 > 编译原理实验指导书
识符的引用时就查TABEL表,看是否有过正确的定义,若已有,则从表中取相应的有关信息,供代码的生成用。PL/0语言的代码生成是由过程GEN完成的。GEN过程有三个参数,分别代表目标代码的功能码、层差、和位移量。生成的代码顺序放在数组CODE中。CODE为一维数组,数组元素为记录型数据.每一个记录就是一条目标指令。CX为指令的指针,由0开始顺序增加。 PL/0语言的目标指令的格式:
其中f代表功能码,l层次差,a:位移量。 目标指令有8条:
① LIT:将常量放到运行栈顶.a域为常数。 ② LOD:将变量放到栈顶.a域为变量在所说明层中的相应位置,l为调用层与说明层的层差值。 ③ STO:将栈顶的内容送入某变量单元中,a,l域的含意同LOD。 ④ CAL:调用过程的指令.a为被调用过程的目标程序入口地址,l为层差。 ⑤ INT:为被调用的过程(或主程序)在运行栈中开辟数据区.a域为开辟的个数。 ⑥ JMP:无条件转移指令,a为转向地址。 ⑦ JPC无条件转移指令,当栈顶的布尔值为非真时,转向a域的地址,否则顺序执行。 ⑧ OPR:关系和算术运算.具体操作由a域给出.运算对象为栈顶和次栈顶的内容进行运算,结果存放在次栈顶,或是其他特殊功能的操作。
9
综合实验
实验三 扩展功能的PL/O编译程序
——扩充PL/0编译程序使其能完成对如下三个扩充功能的编译
PL/0语言的三个扩充功能:
1. 一维数组的扩充,语法如下: VAR <数组标识符> ‘[’数组长度‘]’ 2. 条件语句的扩充,语法如下:
<条件语句> ::=IF<条件>THEN <语句> [ELSE <语句>] 3. 重复语句的扩充,语法如下: <重复语句> ::=REPEAT <语句>{; <语句>}UNTIL <条件>
实验目的:
1. 为了更好的配合《编译原理》有关词法分析章节的教学 2. 加深和巩固学生对于语法分析的了解和掌握
3. 让学生进一步的认识PL/0语言的基础和简单的程序编写 4. 使学生通过本实验能够扩大对pl/0的理解。 5. 提高学生的上机和编程过程中处理具体问题的能力
实验要求
1. 在做本实验之前要先阅读完总体的预备知识以及本实验相关的基础知识。 2. 本实验要求自己独立的完成,不允许抄袭别人的实验结果。 3. 在编写和调试过程中出现的问题最好做一下记录。 4. 阅读懂扩充语法图所给出的语法。
实验内容:
1. 给出三个扩充功能的语法描述图及EBNF的语法描述;
2. 在已理解所给出的pl/0编译程序的基础上,要求对其进行扩展,使扩展后的PL/0编译程序能够完成对三个扩充功能的编译; 3. 结合所给出的两个PL/0源程序(test1.pl0, test2.pl0),对所改进的PL/0编译程序
进行调试;
4. 如果扩充后的编译程序可以完成对test1.pl0, test2.pl0的编译,并能运行得到运
行结果(如图1(a)、图1(b)所示),经老师检查后将有加分; 5. 如果能够使扩充后的编译程序可以支持用表达式作为数组的下表,即允许使用形如array[i],调用数组元素(调试用源码为test3.pl0,运行结果如图1(c)所示),将额外加分; 6. 将实现对三个扩充功能进行编译的思路,以及你对语法分析的理解写在实验报
10
告上。
(a) (b) (c)
图1 (a、b、c)分别为test1.pl0、test2.pl0、test3.pl0的一个可能运行结果
实验环境:
1. 操作系统为Windows 2000或Dos6.2以上。 2. 编程语言为Pascal或C语言。
提示:
1. 扩充的条件语句和重复语句都是语句,而所给的PL/0编译程序中有语句处理
函数,找到相应函数并进行扩充;
2. 所给的三个扩充功能中引入了几个新的关键字,从而必需对相应的全局变量其数据结构进行修改; 3. 注意跳转语句的处理,往往在一跳转语句处不知道所要跳转的指令地址,解决
办法是将该跳转语句地址保存,在知道所要跳转的指令地址后再回填; 4. 要能完成对数组的处理,即使只是用整型常数作为数组下标引用数组元素,所
要做的工作比较多。涉及的有,如何进名字表,如何定位到各个元素,各种语
句中哪些涉及到会直接使用数组元素等,分析清楚这些因素之后,找到各因素对应函数进行修改;
5. 如果要使数组的下标支持表达式,需扩充新的目标指令。
11
附:
test1.pl0: const a=10; procedure p; var d;
procedure q; var x; begin repeat begin read(x); if odd x then
d:=2*x else d:=x; write(d)
end
until x=0
end
begin
call q
end begin
call p end. test2.pl0: const a=10; var e[10]; procedure p; var d; procedure q; var x; begin read(e[1],e[2],e[3],e[4],e[5]); d:=e[1]+e[3]; write(d)
end
12
begin
call q
end
begin call p end. test3.pl0: const a=10; var e[10]; procedure p; var d; procedure q; var x,i;
begin i:=0; repeat begin read(x); if odd x then
e[i]:=2*x else e[i]:=x; write(e[i]); i:=i+1
end
until i=10 end
begin
call q
end
begin call p end.
13
共分享92篇相关文档