编译原理实验
题目:词法分析器
指导老师:
姓名:
学号:
学院:
班级:
时间:2010/06/21
目录
一.实验要求................................................................................................................ 3
二.单词符号的语法.................................................................................................... 3
2-1.单词符号的文法 ..................................................................................... 3
2-2.有穷状态机 DFA ...................................................................................... 3
三.程序设计................................................................................................................ 7
3-1.程序设计思路 ...................................................................................... 7
3-2.流程图 .................................................................................................. 7
3-3.模块化设计(函数调用关系) .......................................................... 8
3-4. 关键问题及解决方案 ........................................................................... 9
四.程序测试.............................................................................................................. 11
4-1. 测试 1 .................................................................................................. 11
4-2. 测试 2 .................................................................................................. 12
五.后续思考.............................................................................................................. 12
5-1. 程序不支持的部分 ............................................................................. 12
5-2. 联系 c 语言语法现象的一些思考 ...................................................... 12
六.附录...................................................................................................................... 13
6-1. 程序源代码 ......................................................................................... 13
6-2. 测试用例 1 .......................................................................................... 21
6-3. 测试用例 2 .......................................................................................... 22
一.实验要求
设计词法分析程序,其功能实现读入源程序,输出单词符号。输出的单词符
号采用以下二元式:(标识符,指向该单词符号所在符号表中位置的指针)。
二.单词符号的语法
2-1.单词符号的文法
<单词符号> -> <标识符>|<常量>|<特殊符号>
<标识符> -> <字母>|<标识符><字母数字>
<字母数字> -> <字母>|<数字>
<字母> -> _|<大写字母>|<小写字母>
<大写字母> -> A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z
<小写字母> ->a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
<数字> -> 0|1|2|3|4|5|6|7|8|9
<常量> -> <数字型常量>|<字符常量>|<字符串常量>
<数字型常量> -> <整数部分>|<整数部分>.<整数部分>
<整数部分> -> <整数部分><整数部分>|<数字>
<字符常量> -> ‘
’ |’\’
<字符串常量> -> “<字符串>”
<字符串> -> < ASCII 符号><字符串>|空
<特殊符号> -> ! | " | # | % | & | ' | ( | ) | * | + | , | - | . | / | : | ; | < | = | > | ? | [ | \
| ] | ^ | { | | | } | ~ | ++ | -- | == | >= | <= | != | && | || | << | >> | += | -= | *= | /=
| %= | &= | |= | ^= | -> | /* | */ | // | >>= | <<= | /* | /
2-2.有穷状态机 DFA
_|0~9|a~z|A~Z
3
3
ASCII
5
“
6
/
46
ASCII
47
‘
_|a~z|A~Z
1
_|0~9|a~z|A~Z
2
ASCII
1
“
1
‘
4
7
ASCII
.
0~9
10
0~9
# | ( | ) | , | . | : | ; | ? | [ | ] | { | } | ~
1
1
+
1
-
1
14
17
+
=
-
>
=
20
'
0~9
13
8
11
15
16
18
19
9
0~9
12
1
1
1
1
1
1
1
1
1
1
=
>
<
&
!
|
!
/
21
23
26
29
32
34
37
39
=
=
*
=
|
=
/
%
^
=
=
41
43
=
>
<
22
24
27
&
30
=
=
25
28
31
33
35
36
38
40
45
42
44
接受状态表示的单词符号类型对应关系如下:
接受状态
2、3
6
9
10、12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
45
41
42
43
44
单词符号类型
标识符
字符串常量
字符常量
数字型常量
#、(、)、,、.、:、;、?、[、]、{、}、~
+
++
+=
-
--
-=
->
=
==
>
>>
>=
<
<<
<=
&
&&
&=
!
!=
|
||
|=
*
*=
/
//
/*
%
%=
^
^=
三.程序设计
3-1.程序设计思路
将单词符号分为保留字,用户定义的标识符,常量,特殊符号 4 类。保留字
与用户定义的标识符统称为标识符。常量包括整数型常量,字符常量,符号串常
量。特殊符号包括运算符与分隔符。
进行词法分析前先初始化建立 5 个文件,分别为保留字文件(编号为 1),
用户定义标识符文件(编号为 2),常量文件(编号为 3),特殊符号文件(编
号为 4),输出文件。其中,保留字文件每行记录一个保留字,共 32 个保留字。
特殊符号文件每行记录一个特殊符号,共 49 个特殊符号。而用户定义标识符文
件,常量文件与输出文件都为空。
通过状态机识别单词符号,结束状态判别单词符号的类别。若类别为标识符,
则首先与保留字文件中的保留字比较以判断是否为保留字,若是,则输出保留字
文件编号与该保留字在该文件中的行数;若不是,则与用户定义标识符文件中的
用户定义标识符比较以判断是否已存在这样的标识符,若存在,则输出用户定义
标识符文件编号与该标识符所在的行数;若不存在,则将该标识符输入用户定义
标识符文件,并输出用户定义标识符文件编号与该新加标识符所在的的行数。若
类别为常量,则与常量文件中的常量比较以判断是否已存在这样的常量,若存在,
则输出常量文件编号与该常量行数;若不存在,则将该常量输入常量文件,并输
出常量文件编号与该新加常量所在的行数。若类别为特殊符号,则与特殊符号文
件中的特殊符号比较,输出特殊符号文件编号与该特殊符号在该文件中的行数。
输出的二元式为:(标识符,指向该单词符号所在符号表中位置的指针),其中,
单词符号所在符号表中的位置由符号表编号和在符号表中的行数确定。
3-2.流程图
开始
初始化 4 个文件
将输入文件以字符
为单位送入状态机
判断单词类别
常量
标识符
特殊符号
是否为保留字
保留字
用户定义标识符
将该标识符与该标识符所在符
号表中的位置输出到输出文件
结束
3-3.模块化设计(函数调用关系)
Main()
Initial()
Sort()
WriteBack()
Move()