编译原理上机报告 targetblank.docx
- 文档编号:1814953
- 上传时间:2022-10-24
- 格式:DOCX
- 页数:8
- 大小:16.63KB
编译原理上机报告 targetblank.docx
《编译原理上机报告 targetblank.docx》由会员分享,可在线阅读,更多相关《编译原理上机报告 targetblank.docx(8页珍藏版)》请在冰豆网上搜索。
编译原理上机报告targetblank
编译原理上机报告target=blank
编译原理上机报告
学号:
9761072
姓名:
褚瑞
一.实习目的:
通过上机实习加深对编译原理的理解和熟悉编译程序的构造方法。
二.实习方法:
出于熟悉编译原理的目的,我用C语言重写了整个程序,由于工作量的原因,没有设计新的程序结构和虚拟机指令等等,全部编译程序源代码包括下列文件:
symbol.cpp用于词法分析
declaration.cpp用于语法分析的声明部分
expression.cpp用于语法分析的表达式处理部分
semantic.cpp用于语法分析的其它部分
objcode.cpp用于生成代码
error.cpp用于错误处理
main.cpp主程序
另外,interpret目录下有interpret.cpp和main.cpp,用于编译成为一个虚拟机的解释程序。
全部源代码在Windows2000Professional,VisualC++6.0以及RedHat7.0下编译调试通过。
使用标准C语言编写,从而能在Linux下运行,是我的程序的一个特色。
三.测试程序
为了测试所有可能的代码,我编写了下面的测试PL程序。
这个程序可以编译,但是运行起来是没有意义的,它仅仅是为了包括常量,变量,数组等类型,并且包括比较复杂的表达式处理和几乎所有支持的语句,以便对编译程序进行测试。
programpp;
constPI=3testconst='z'testconst1=TRUE
typetesttype=BOOLEANtestarray=array[2..20,0..50]ofboolean
varn,p:
integercr:
char
procedurep1(n:
integer;varp:
integer);
varin_proc:
charcr1:
testarray
begin
cr1(2,3):
=cr1(n,cr1(n,p))+p;
in_proc:
=2+p*(testconst+1);
ifn<=1then
whiletestconst1don:
=PI
else
ifp>1then
begin
p:
=n*p;
n:
=p/n;
end;
callp1(n,cr1(2,5));
end;
begin
callread(n);
callp1(n,p);
callwrite(p)
end.
为了测试运行的情况,我们编写一个稍稍简单的例子,这是参考教材中求阶乘的源程序:
programpp;
varn,p:
integer
procedurep1(n:
integer;varp:
integer);
varin_proc:
char
begin
ifn<=1thenp:
=1
else
begin
callp1(n-1,p);
p:
=n*p
end
end;
begin
callread(n);
callp1(n,p);
callwrite(p)
end.
四.编译结果
采用编译程序对这两个PL源程序进行编译。
第一个程序的结果如下:
0ENTP1,9;进入过程
1JMP0,83;无条件跳转
2ENTP2,978;进入过程
3JMP0,4;无条件跳转
4LIT0,2;装入常量
5LIT0,2;装入常量
6SUB
7LIT0,19;装入常量
8MULT
9LIT0,3;装入常量
10ADD
11LODA2,9;装入变量地址
12ADD
13LOD2,0;装入变量值
14LIT0,2;装入常量
15SUB
16LIT0,19;装入常量
17MULT
18LOD2,0;装入变量值
19LIT0,2;装入常量
20SUB
21LIT0,19;装入常量
22MULT
23LOD2,4;装入变量值
24ADD
25LODA2,9;装入变量地址
26ADD
27LODT;装入栈顶值为地址的内容
28ADD
29LODA2,9;装入变量地址
30ADD
31LODT;装入栈顶值为地址的内容
32LOD2,4;装入变量值
33ADD
34STO;将栈顶值存入栈顶次值所指单元
35LODA2,8;装入变量地址
36LIT0,2;装入常量
37LOD2,4;装入变量值
38LIT0,122;装入常量
39LIT0,1;装入常量
40ADD
41MULT
42ADD
43STO;将栈顶值存入栈顶次值所指单元
44LOD2,0;装入变量值
45LIT0,1;装入常量
46LEQ;<=
47JPC0,55;栈顶值为0时跳转
48LIT0,1;装入常量
49JPC0,54;栈顶值为0时跳转
50LODA2,0;装入变量地址
51LIT0,3;装入常量
52STO;将栈顶值存入栈顶次值所指单元
53JMP0,48;无条件跳转
54JMP0,69;无条件跳转
55LOD2,4;装入变量值
56LIT0,1;装入常量
57GTR;>
58JPC0,69;栈顶值为0时跳转
59LODA2,4;装入变量地址
60LOD2,0;装入变量值
61LOD2,4;装入变量值
62MULT
63STO;将栈顶值存入栈顶次值所指单元
64LODA2,0;装入变量地址
65LOD2,4;装入变量值
66LOD2,0;装入变量值
67IDIV
68STO;将栈顶值存入栈顶次值所指单元
69OPAC;打开活动记录
70LOD2,0;装入变量值
71LIT0,2;装入常量
72LIT0,2;装入常量
73SUB
74LIT0,19;装入常量
75MULT
76LIT0,5;装入常量
77ADD
78LODA2,9;装入变量地址
79ADD
80CALL1,2;转子
81UDIS1,2;调整Display
82RETP;过程返回
83LODA1,0;装入变量地址
84READ0,0;读指令
85OPAC;打开活动记录
86LOD1,0;装入变量值
87LODA1,4;装入变量地址
88CALL1,2;转子
89LODA1,4;装入变量地址
90WRITE0,0;写指令
91ENDP;程序结束
第二个程序编译结果:
0ENTP1,8;进入过程
1JMP0,25;无条件跳转
2ENTP2,9;进入过程
3JMP0,4;无条件跳转
4LOD2,0;装入变量值
5LIT0,1;装入常量
6LEQ;<=
7JPC0,12;栈顶值为0时跳转
8LOD2,4;装入变量值
9LIT0,1;装入常量
10STO;将栈顶值存入栈顶次值所指单元
11JMP0,24;无条件跳转
12OPAC;打开活动记录
13LOD2,0;装入变量值
14LIT0,1;装入常量
15SUB
16LOD2,4;装入变量值
17CALL1,2;转子
18UDIS1,2;调整Display
19LOD2,4;装入变量值
20LOD2,0;装入变量值
21ILOD2,4;间接装入
22MULT
23STO;将栈顶值存入栈顶次值所指单元
24RETP;过程返回
25LODA1,0;装入变量地址
26READ0,0;读指令
27OPAC;打开活动记录
28LOD1,0;装入变量值
29LODA1,4;装入变量地址
30CALL1,2;转子
31LODA1,4;装入变量地址
32WRITE0,0;写指令
33ENDP;程序结束
五.运行结果:
我们用interpret.exe执行生成的obj文件,结果如下所示:
Input:
5
120
5!
=120,说明程序运行完全正确。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理上机报告 targetblank 编译 原理 上机 报告