编译原理上机报告
学号: 9761072
姓名:褚瑞
一. 实习目的:
通过上机实习加深对编译原理的理解和熟悉编译程序的构造方法。
二. 实习方法:
出于熟悉编译原理的目的,我用C语言重写了整个程序,由于工作量的原因,没有设计新的程序结构和虚拟机指令等等,全部编译程序源代码包括下列文件:
symbol.cpp用于词法分析
declaration.cpp用于语法分析的声明部分
expression.cpp用于语法分析的表达式处理部分
semantic.cpp用于语法分析的其它部分
objcode.cpp用于生成代码
error.cpp用于错误处理
main.cpp主程序
另外,interpret目录下有interpret.cpp和main.cpp,用于编译成为一个虚拟机的解释程序。
全部源代码在Windows 2000 Professional,Visual C++ 6.0以及Red Hat 7.0下编译调试通过。使用标准C语言编写,从而能在Linux下运行,是我的程序的一个特色。
三. 测试程序
为了测试所有可能的代码,我编写了下面的测试PL程序。这个程序可以编译,但是运行起来是没有意义的,它仅仅是为了包括常量,变量,数组等类型,并且包括比较复杂的表达式处理和几乎所有支持的语句,以便对编译程序进行测试。
program pp;
const PI=3 testconst='z' testconst1=TRUE
type testtype=BOOLEAN testarray=array[2..20,0..50] of boolean
var n,p:integer cr:char
procedure p1(n:integer;var p:integer);
var in_proc:char cr1:testarray
begin
cr1(2,3):=cr1(n,cr1(n,p))+ p;
in_proc:=2+p*(testconst+1);
if n<=1 then
while testconst1 do n:=PI
else
if p>1 then
begin
p:=n*p;
n:=p/n;
end;
call p1(n,cr1(2,5));
end;
begin
call read(n);
call p1(n,p);
call write(p)
end.
为了测试运行的情况,我们编写一个稍稍简单的例子,这是参考教材中求阶乘的源程序:
program pp;
var n,p:integer
procedure p1(n:integer;var p:integer);
var in_proc:char
begin
if n<=1 then p:=1
else
begin
call p1(n-1,p);
p:=n*p
end
end;
begin
call read(n);
call
p1(n,p);
call write(p)
end.
四. 编译结果
采用编译程序对这两个PL源程序进行编译。
第一个程序的结果如下:
0ENTP1 , 9;进入过程
1JMP0 , 83;无条件跳