4. 如果扩充后的编译程序可以完成对test1.pl0, test2.pl0的编译,并能运行得到运
行结果(如图1(a)、图1(b)所示),经老师检查后将有加分; 5. 如果能够使扩充后的编译程序可以支持用表达式作为数组的下表,即允许使用形如array[i],调用数组元素(调试用源码为test3.pl0,运行结果如图1(c)所示),将额外加分; 6. 将实现对三个扩充功能进行编译的思路,以及你对语法分析的理解写在实验报
编译原理实验指导
告上。
(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. 如果要使数组的下标支持表达式,需扩充新的目标指令。
编译原理实验指导
附:
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
编译原理实验指导
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.