编译器设计
——编译原理实验报告
班号:
姓名:
学号:
1
目录
一、实验简介 .................................................................................................................................... 3
二、语言定义 .................................................................................................................................... 3
三、 词法分析 .................................................................................................................................. 4
1.实现方法 ................................................................................................................................. 4
2. 各种单词符号对应的种别码 ............................................................................................... 4
3.具体实现流程图 ..................................................................................................................... 5
4.错误处理 ................................................................................................................................. 5
四、语法分析 .................................................................................................................................... 6
1.实现方法 ................................................................................................................................. 6
2. LR(1)分析表的获取 ......................................................................................................... 6
3. 总控程序 ............................................................................................................................... 7
4.程序流程图 ............................................................................................................................. 8
4.错误处理 ................................................................................................................................. 9
五、语义分析 .................................................................................................................................. 10
1 实现方法 ............................................................................................................................... 10
2. 四元式定义......................................................................................................................... 10
3.语法制导翻译具体实现 ....................................................................................................... 10
4.错误处理 ............................................................................................................................... 12
六、目标代码生成 .......................................................................................................................... 12
1.实现方法 ............................................................................................................................... 12
2.汇编指令集 ........................................................................................................................... 12
3.具体实现 ............................................................................................................................... 13
七、程序运行测试 .......................................................................................................................... 13
1.测试样例 ............................................................................................................................... 13
2.词法分析结果 ....................................................................................................................... 13
3.语法分析结果 ....................................................................................................................... 14
4.语义分析结果 ....................................................................................................................... 15
5.汇编代码生成 ....................................................................................................................... 15
九、实验总结 .................................................................................................................................. 17
2
一、实验简介
本次实验旨在设计一个类 C 语言子集的编译器,可以对自己设计的语言进行编译,最
终生成可执行的汇编代码。
通过实验教学,加深学生对所学的关于编译原理的理论知识的理解,增强学生对所学
知识的综合应用能力,并通过实验达到对所学的知识进行验证。
实验分为词法分析、语法分析、语义分析和中间代码生成、汇编代码生成四个阶段。
通过实验,使学生掌握词法分析的实现技术,深入了解语法分析的四种实现技术及具体实
现方法,掌握语义分析的实现技术及具体实现方法,了解代码优化和代码生成的实现技术
及具体实现方法。明确编译各阶段之间的关系。熟悉符号表的建立及在编译过程中的作用。
二、语言定义
本次实验所设计的语言是 C 语言的子集,支持 int、char、double、bool 四种数据类型,
实现了声明、赋值、基本四则算术运算、分支语句、循环语句、数组、函数、输入输出等
功能。
语言的文法如下:
<程序> → main(){<语句序列>}| <函数><程序>
<语句序列> → <语句>;<语句序列> |<语句>;
<语句> → ||<赋值语句>|||<函数调用语
句>|<变量定义语句>
<表达式> → <表达式> <加减符> <项> | <项>
<加减符> → + | -
<项> → <项> <乘除符> <因子> | <因子>
<乘除符> → * | /
<因子> → (<表达式>) | num | <变量> | 字符
<条件表达式> -> <表达式> <比较符号> <表达式>
<比较符号> -> < | > | <> | >= | <= |==
<函数> -> id(<参数>){<语句序列>}
<参数> -> <变量定义语句> | <变量定义语句>,<参数>
<变量定义语句> -> <变量类型> <变量>
<变量类型> -> int | double | bool | char
<变量> -> id | id[num] | id[id]
<函数调用语句> -> id(<调用参数>)
<调用参数> -> <表达式> | <表达式>,<调用参数>
→ if <条件表达式> {<语句序列> } | if <条件表达式> { <语句序列>} else {<
语句序列> }
3
→ while (<条件表达式>) {<语句序列>}
→ read id
→ write id
<赋值语句> → id=<条件表达式> | id[num]=<条件表达式> | id[id]=<条件表达式> |
id=<表达式> |id[num]=<表达式> | id[id]=<表达式>
为了方便之后的程序处理,我把所有的终结符和非终结符都用单个字符表达:
<程序> P
Main M
<语句序列> L
<函数> H
<语句> Y
I
<函数调用语句> J
T
R
W
<赋值语句> F
<变量定义语句> B
<参数> A
<调用参数> D
<变量类型> Z
<变量> C
<表达式> b
<条件表达式> t
<比较符号> a
<逻辑符> o
<加减符> j
<项> x
<乘除符> c
<因子> y
字符 l
num n
id
NOT N
AND Q
i
[非终结符]
P L Y b j x c y t a H A B Z C J D I W R T F G
[终结符]
( ) { } [ ] + - * / : , = 1 2 3 4 n i f e w r g h d k p M < > l
f
e
OR O
if
else
while w
r
Read
Write
g
Int
h
double
bool k
char p
<> 1
== 2
<= 3
>= 4
d
三、词法分析
1.实现方法
通过逐词读入样例程序中的内容,对每个单词进行判断分析,输出该单词的内容以及
种别码。
2.各种单词符号对应的种别码
单词符号
main
if
else
int
种别码
M
f
e
h
单词符号
]
(
)
+
4
种别码
]
(
)
+
k
bool
d
double
p
char
w
while
r
read
g
wirte
i
id(变量名)
inum(整型数)
n
dnum(浮点型数) 9
{
{
}
}
[
[
3.具体实现流程图
-
/
*
=
==
<>
>
<
>=
<=
,
;
-
/
*
=
2
1
>
<
4
3
,
;
4.错误处理
当遇到非法字符、标示符与关键字重复时会显示相应的错误信息。
5
四、语法分析
1.实现方法
使用 LR(1)算法,首先求出语言定义文法的 LR(1)分析表,然后 LR 分析算法的总控程
序根据分析表对源语言进行语法分析。
2.LR(1)分析表的获取
(1)求 FIRST(X)集的算法
;
步骤:
1.FIRST(X)=
2.if (X∈T) then FIRST(X):= {X} ;
3.if X∈V then
begin
4.if (X→ε P) then FIRST(X):= FIRST(X)∪{a|X→a…∈Pand a∈T};
5.if (X→ε∈P) then FIRST(X):= FIRST(X)∪ {ε}
end
6.对 X∈V,重复如下的过程 7-10,直到所有 FIRST 集不变为止。
7.if (X→Y…∈P and Y∈Vand Y →ε P)
then FIRST(X):= FIRST(X)∪(FIRST(Y)-{ε});
8.if (X→Y1…Yn∈P and Y1...Yi-1 ε) then
9.FIRST(X):= FIRST(X)∪(FIRST(Yi)-{ε});
10.if Y1...Yn
ε then FIRST(X):=FIRST(X)∪{ε};
(2)求 FOLLOW(X)集的算法
步骤:
1.对 X∈V,FOLLOW(S) :=
2.FOLLOW(S) := {#},#为句子的结束符;
3.对 X∈V,重复下面的第 4 步到第 5 步,直到所有 FOLLOW 集不变
;
为止。
4.若 A→αBβ∈P,则 FOLLOW(B):=FOLLOW(B)∪FIRST(β)–{ε};
5.若 A→αB 或 A→αBβ∈P,且β
FOLLOW(B):=FOLLOW(B)∪FOLLOW(A);
ε,A≠B,则
(3)求 CLOSURE(I)集的算法
J:=I;
repeat
J=J∪{[B→.η,b]|[A→α.Bβ,a]∈J,
b∈FIRST(βa)}
until J 不再扩大
(4)function GO(I, X);
begin
J:= ;
6
for I 中每个形如 A→α.Xβ的项目 do
end;
begin J:=J∪{A→αX.β}
return CLOSURE(J)
end;
(5)计算 LR(1)项目集规范族C
begin
C:= {closure({ S'→.S,#})};
repeat
for
I∈C, X ∈ V∪T
if go(I,X)≠Φ & go(I,X) C then
C=C∪go(I,X)
until C 不变化
end.
(6)LR(1) 分析表的构造
1.令 I0= CLOSURE({S'→.S}),构造 C={ I0, I1, …, In},即 G'的 LR(1)
项目集规范族。
2.从 Ii 构造状态 i,0 为初始状态。
for k=0 to n do
begin
Ik & a T & GO(Ik, a)=Ij then action[k,a]:=Sj;
⑴ if [A→α.aβ, b]
⑵ if GO(Ik, B)=Ij & B V then goto[k,B]:=j;
⑶ if [A→α., a]
⑷ if [S'→S., #]
Ik & A→α为 G'的第 j 个产生式 then action[k,a]:=rj;
Ik then action[k,#]:=acc;
end
上述⑴到⑷步未填入信息的表项均置为 error。
3.总控程序
开始时,#S 在分析栈中,其中 S 是文法的开始符号,在栈顶;令指针 ip
指向 W#的第一个符号;repeat
/*X 是非终结符号*/
让 X 等于栈顶符号,a 为 ip 所指向的符号;
if X 是终结符号或# then
If X=a then 把 X 从栈顶弹出并使 ip 指向下一个输入符号
else error()
else
if M[x,a]=Xày1y2…yk then begin
从栈中弹出 X;把 yk,yk-1,…,y1 压入栈,y1 在栈顶;
输出产生式 Xày1y2…yk;end
else error()
until X=#
/*栈空*/
7
4.程序流程图
制表程序流程图:
8