编译器编译原理课程设计报告书.docx
- 文档编号:28354184
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:67
- 大小:203.61KB
编译器编译原理课程设计报告书.docx
《编译器编译原理课程设计报告书.docx》由会员分享,可在线阅读,更多相关《编译器编译原理课程设计报告书.docx(67页珍藏版)》请在冰豆网上搜索。
编译器编译原理课程设计报告书
广西大学
编译原理课程设计
专业:
计算机科学与技术
姓名:
课程:
编译原理
指导教师:
一.程序简介与分析---------------------------------------------------------1
二.程序适用范围-----------------------------------------------------------1
三.词法分析---------------------------------------------------------------1
四.语法分析---------------------------------------------------------------3
五.语义分析和中间代码生成------------------------------------------------9
六.代码生成--------------------------------------------------------------11
七.流程图----------------------------------------------------------------12
八.实现------------------------------------------------------------------13
九.程序运行结果----------------------------------------------------------13
十.总结------------------------------------------------------------------18
十一.附录(源程序)--------------------------------------------------------19
简单的编译程序设计
一.程序简介与分析
本程序由四个部分组成:
词法分析子程序,语法分析子程序,语义分析子程序,目标代码生成程序。
本程序输入一个叫haominjie.txt的c语言源程序,然后对它进行词法,语法,语义分析,并输出汇编代码。
词法分析输入的是c语言源程序,输出的3是具有独立语法意义的单词符号。
语法分析以词法分析产生的编码流为输入,按照SLR
(1)分析方法进行语法分析,产生语法树,输出移进和归约的动作,如果源程序不符合文法,则有“语法分析出错”的提示。
语义分析阶段,在语法分析的同时,在归约的时候,给出相应的语义动作,最后输出中间代码四元式和新的符号表,如果有未声明的变量出现,则会提示出出错,并显示出此变量的名称。
代码生成阶段,将语义分析得到的中间代码四元式转化为汇编语言的目标代码并输出。
二.程序适用范围
本程序的使用范围为:
整型常量,四则运算(为了简化问题,本程序只考虑加法运算和乘法运算)和布尔表达式以及相应的赋值语句,条件转移语句和循环语句。
三.词法分析
根据词法分析的需要,我将源程序中的单词符号分为:
保留字,字母(标识符),
界符三类,统一用一张表表示如下:
界符,保留字表
单词
=
+
*
>
:
;
{
}
(
)
and
if
then
while
do
int
标志符
编码
1
2
3
4
5
6
7
8
9
10
31
32
33
35
36
37
25
程序从源程序文件haominjie.txt中一次读入一个字符,并判断它是不是字母,界符,
保留字,空格,换行,结束符号或者非法字符。
流程图如下:
词法分析流程图
四.语法分析
.源程序中涉及的文法G[P]定义如下表:
说明语句
表达式
布尔表达式
句法
0、P’→P
1、P→id()L;R
2、L→L;D
3、L→D
4、D→id:
int
5、E→E+T
6、E→T
7、T→T*F
8、T→F
9、F→(E)
10、F→id
11、B→BandB
12、B→id>id
13、M→id=E
14、S→ifBthenM
15、S→whileBdoM
16、S→M
17、N→N;S
18、N→S
19、R→{N}
.上述文法的每个非终结符的FIRST集和FOLLOW集如下表:
FIRST集
FOLLOW集
P
{id}
{#}
L
{id}
{;}
D
{id}
{;}
E
{(,id}
{},;,+,),#}
T
{(,id}
{},;,+,),*,#}
F
{(,id}
{},;,+,),*,#}
B
{id}
{then,do,and}
M
{id}
{},;}
S
{id,while,if}
{},;}
N
{id,while,if}
{},;}
R
{{}
{#}
.文法G[P]的项目集部分如下:
0.P’→.P1.P’→P.
2.P→.id()L;R3.P→id.()L;R4.P→id(.)L;R
5.P→id().L;R6.P→id()L.;R7.P→id()L;.R
8.P→id()L;R.9.L→.L;D
10.L→L.;D11.L→L;.D12.L→L;D.
13.D→.id:
int14.D→id.:
int15.D→id:
.int
16.D→id:
int.17.E→.E+T18.E→E.+T
19.E→E+.T20.E→E+T.21.E→.T
22.E→T.23.T→.T*F24.T→T.*F
25.T→T*.F26.T→T*F.27.T→.F
28.T→F.29.F→(E)30.F→(.E)
31.F→(E.)32.F→(E).33.F→.id
34.F→id.
.再由项目集构造文法的DFA活前缀。
为了方便,省去了项目族集的每个状态的项目,直接在状态转换的箭头上标明终结符或非终结符。
对于有规约动作和接受的状态,将其特别标明。
文法G[P]的DFA图如下:
11
10
9
4
3
2
0
1
5
6
7
12
23
24
25
26
13
21
22
18
17
19
27
20
15
14
30
29
28
16
31
34
35
32
33
38
36
37
41
42
39
40
43
8
有归约动作
接受状态
:
int说明语句
DidDid
R;L)(idP
{
ifBthenM
idandid句法
Sid=
}ifid
MN
;Sid
Mwhile
whileBdoM
idand
idB
布尔表达式>and
id
Tid
id(FE
*(
F(id
Fid+
E(表达式
+
)T
*
G[P]:
SLR
(1)分析表
Action
goto
id
(
)
;
:
*
+
>
=
{
}
int
and
if
then
while
do
$
P
D
R
E
T
F
B
M
S
L
N
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
0
1
2
3
4
5
6
7
8
9
10
0
s2
1
1
acc
2
s3
3
s4
4
s5
8
9
5
s6
6
s7
7
r4
8
r3
9
s10
10
s5
s13
12
11
11
r1
12
r2
13
s14
s23
s27
22
21
17
14
s15
15
s36
s41
16
38
37
16
r13
s43
r13
17
s19
s18
18
r19
19
s14
s23
s27
22
20
G[P]:
SLR
(1)分析表
Action
goto
id
(
)
;
:
*
+
>
=
{
}
int
and
if
then
while
do
$
P
D
R
E
T
F
B
M
S
L
N
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
0
1
2
3
4
5
6
7
8
9
10
20
r17
r17
21
r18
r18
22
r16
r16
23
s31
24
24
s34
s25
25
s14
26
26
r14
r14
27
s31
28
28
s34
29
s14
s29
30
30
r15
r15
31
s32
32
s33
33
r12
r12
r12
34
s31
35
35
r11
r11
r11
36
r10
r10
r10
r10
r10
37
r8
r8
r8
r8
r8
38
r6
r6
s39
r6
r6
39
s36
s41
40
G[P]:
SLR
(1)分析表
action
goto
id
(
)
;
:
*
+
>
=
{
}
int
and
if
then
while
do
$
P
D
R
E
T
F
B
M
S
L
N
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
0
1
2
3
4
5
6
7
8
9
10
40
r7
r7
r7
r7
r7
41
s36
s41
42
38
37
42
s45
s43
43
s36
s41
44
37
44
r5
r5
s39
r5
r5
45
r9
r9
r9
r9
r9
五.语义分析和中间代码生成
载语法分析过程中,随着分析的步步进展,根据每个产生式所对应的语义子程序(或语义规则描述的语义动作)进行翻译的办法称作语法制导翻译。
语法制导翻译
归约动作
翻译方案
E→E+T
E→E1+T
{E.place=newtemp;
Emit(E.place’:
=’E1.place’+’T.place);}
E→T
E→T
{E.place:
=T.place;}
T→T*F
T→T1*F
{T.place=newtemp;
Emit(T.place’:
=’T1.place’+’F.place);}
T→F
T→F
{T.place:
=F.place;}
F→(E)
F→(E)
{F.place:
=E.place;}
F→id
F→id
{p:
=lookup(id.name);
ifp<>nilthenF.place:
=p
elseerror;}
B→BandB
B→B1andAB2
{backpatch(B1.truelist,A.quad);
B.truelist:
=B2.truelist;
B.falselist:
=merge(B1.falselist,B2.falselist);}
A→∈{A.quad:
=nextquad}
B→id>id
B→id1>id2
{B.truelist:
=makelist(nextquad);
B.falselist:
=makelist(nextquad+1);
emit(ifid1.place’>’id2.place’goto__’);
emit(’goto__’);}
M→id=E
M→id=E
{p:
=lookup(id.name);
ifp<>nilthenemit(p’:
=’E.place)
elseerror;}
S→ifBthenM
S→ifBthenAM
{backpatch(B.truelist,A.quad)
backpatch(B.falselist,nextquad)}
A→∈{A.quad:
=nextquad}
S→whileBdoM
S→whileA1BdoA2M
{backpatch(B.truelist,A2.quad)
backpatch(B.falselist,nextquad+1)
emit(’goto’A1.quad)}
A1→∈{A1.quad:
=nextquad}
A2→∈{A2.quad:
=nextquad}
语法翻译生成的四元式如下:
六.代码生成
目标代码生成阶段的任务是把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。
这是编译的最后阶段,它的工作与硬件系统结构和指令含义有关,这个阶段的工作很复杂,涉及到硬件系统功能部件的运用、机器指令的选择、各种数据类型变量的存储空间分配以及寄存器和后缓寄存器的调度等。
本程序生成的目标代码与0x8086微处理器兼容。
下面列举几个简单的四元式与汇编代码的转化列子:
.(+,A,B,T)→
MOVR,A;
ADDR,B;
STR,T
.(*,A,B,T)→
MOVR,A;
MULR,B;
STR,T
.(J,_,_,L)→
JMPL
.(J>,A,B,L)→
MOVR,A
CMPR,B
JBL
.(=,A,_,T)→
LDR,A
STR,T
本程序生成的目标代码如下:
七.程序流程图
编译程序流程图
八.实现
本程序运行的硬件环境为CPU2GHZ,内存为4G.软件环境为windows8.1
系统,VisualC++环境。
九.程序运行结果
1.输入源文件路径:
2.输出保留字
3.输出符号表的内容
5.输出语法分析的结果(本程序采用自下而上的LR语法分析)
6.输出中间代码
7.输出目标代码
一十.总结
通过本次实验,对编译程序各阶段有了更深刻更深入的了解,也纠正了自己在某些方面的的错误,丰富了自己关于编译原理方面的知识。
同时也培养了自己热爱思考,勤查资料的习惯。
由于水平本次实验涉及面并不是很全面,我只考虑了c语言的一个子集。
当然本程序的算法在某些地方也还存在一些缺陷。
一十一.附录(源程序)
本程序输入的c源代码如下:
haominjie()
a:
int;
b:
int;
ccc:
int;
d:
int;
{
ifccc>bandccc>athena=b+a;
whileccc>ddoa=d;
a=(b+ccc)*a+d
}
本程序的完整源代码如下:
#include
#include
#include
#include
#include
#include
usingnamespacestd;
structtoken//词法token结构体
{
intcode;//编码
intnum;//递增编号
token*next;
};
token*token_head,*token_tail;//token队列
structstr//词法string结构体
{
intnum;//编号
stringword;//字符串内容
str*next;
};
str*string_head,*string_tail;//string队列
structivan//语法产生式结构体
{
charleft;//产生式的左部
stringright;//产生式的右部
intlen;//产生式右部的长度
};
ivancss[20];//语法
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译器 编译 原理 课程设计 报告书