编译原理课程设计C语言编译器的实现文档格式.docx
- 文档编号:18872871
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:60
- 大小:464.65KB
编译原理课程设计C语言编译器的实现文档格式.docx
《编译原理课程设计C语言编译器的实现文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计C语言编译器的实现文档格式.docx(60页珍藏版)》请在冰豆网上搜索。
*
>
:
;
{
}
(
)
and
if
then
while
do
int
标志符
编码
1
2
3
4
5
6
7
8
9
10
31
32
33
35
36
37
25
程序从源程序文件libo.txt中一次读入一个字符,并判断它是不是字母,界符,
保留字,空格,换行,结束符号或者非法字符。
流程图如下:
词法分析流程图
四.语法分析
.源程序中涉及的文法G[P]定义如下表:
说明语句
表达式
布尔表达式
句法
0、P’→P
1、P→id()L;
R
2、L→L;
D
3、L→D
4、D→id:
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}
E
{(,id}
{},;
+,),#}
T
+,),*,#}
F
{(,id}
B
{then,do,and}
M
}
{id,while,if}
N
{{}
.文法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;
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图如下:
:
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
$
11
12
13
14
15
16
17
s2
acc
s3
s4
s5
s6
s7
r4
r3
s10
s13
r1
r2
s14
s23
s27
22
21
s15
s36
s41
38
r13
s43
s19
s18
18
r19
19
20
r17
r18
r16
23
s31
24
s34
s25
26
r14
27
28
29
s29
30
r15
s32
s33
r12
34
r11
r10
r8
r6
s39
39
40
action
r7
41
42
s45
43
44
r5
45
r9
五.语义分析和中间代码生成
载语法分析过程中,随着分析的步步进展,根据每个产生式所对应的语义子程序(或语义规则描述的语义动作)进行翻译的办法称作语法制导翻译。
语法制导翻译
归约动作
翻译方案
E→E+T
E→E1+T
{E.place=newtemp;
Emit(E.place’:
=’E1.place’+’T.place);
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.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>
B→id1>
id2
{B.truelist:
=makelist(nextquad);
B.falselist:
=makelist(nextquad+1);
emit(ifid1.place’>
’id2.place’goto__’);
emit(’goto__’);
M→id=E
{p:
nilthenemit(p’:
=’E.place)
S→ifBthenM
S→ifBthenAM
{backpatch(B.truelist,A.quad)
backpatch(B.falselist,nextquad)}
S→whileBdoM
S→whileA1BdoA2M
{backpatch(B.truelist,A2.quad)
backpatch(B.falselist,nextquad+1)
emit(’goto’A1.quad)}
A1→∈{A1.quad:
A2→∈{A2.quad:
语法翻译生成的四元式如下:
六.代码生成
目标代码生成阶段的任务是把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。
这是编译的最后阶段,它的工作与硬件系统结构和指令含义有关,这个阶段的工作很复杂,涉及到硬件系统功能部件的运用、机器指令的选择、各种数据类型变量的存储空间分配以及寄存器和后缓寄存器的调度等。
本程序生成的目标代码与0x8086微处理器兼容。
下面列举几个简单的四元式与汇编代码的转化列子:
.(+,A,B,T)→
MOVR,A;
ADDR,B;
STR,T
.(*,A,B,T)→
MULR,B;
.(J,_,_,L)→
JMPL
.(J>
A,B,L)→
MOVR,A
CMPR,B
JBL
.(=,A,_,T)→
LDR,A
STR,T
本程序生成的目标代码如下:
七.程序流程图
编译程序流程图
八.实现
本程序运行的硬件环境为CPU1.66HZ,内存为768M.软件环境为windowsxp
系统,VisualC++环境。
九.程序运行结果
1.输入源文件路径:
2.输出保留字
3.输出符号表的内容
5.输出语法分析的结果(本程序采用自下而上的LR语法分析)
6.输出中间代码
7.输出目标代码
十.总结
通过本次实验,我对编译程序各阶段有了更深刻更深入的了解,也纠正了自己在某些方面的的错误,丰富了自己关于编译原理方面的知识。
同时也培养了自己热爱思考,勤查资料的习惯。
由于水平本次实验涉及面并不是很全面,我只考虑了c语言的一个子集。
当然本程序的算法在某些地方也还存在一些缺陷。
十一.附录(源程序)
本程序输入的c源代码如下:
libo()
a:
int;
b:
ccc:
d:
ifccc>
bandccc>
athena=b+a;
whileccc>
ddoa=d;
a=(b+ccc)*a+d
本程序的完整源代码如下:
#include<
cstdio>
iostream>
cstdlib>
fstream>
string>
cmath>
usingnamespacestd;
structtoken//词法token结构体
intcode;
//编码
intnum;
//递增编号
token*next;
};
token*token_head,*token_tail;
//token队列
structstr//词法string结构体
//编号
stringword;
//字符串内容
str*next;
str*string_head,*string_tail;
//string队列
structivan//语法产生式结构体
charleft;
//产生式的左部
stringright;
//产生式的右部
intlen;
//产生式右部的长度
ivancss[20];
//语法20个产生式
structpank//语法action表结构体
charsr;
//移进或归约
intstate;
//转到的状态编号
pankaction[46][18];
//action表
intgo_to[46][11];
//语法go_to表
structike//语法分析栈结构体,双链
ike*pre;
//状
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 课程设计 语言 编译器 实现