编译原理实验词法解析总结器的设计及实现.doc
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南华大学
计算机科学与技术学院
实验报告
( 2018~2019学年度第二学期)
课程名称编译原理
实验名称词法分析器的设计与
实现
姓名学号
专业班级
地点教师
1.实验目的及要求
实验目的
加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。
实验要求
1.对单词的构词规则有明确的定义;
2.编写的分析程序能够正确识别源程序中的单词符号;
3.识别出的单词以 <种别码,值 >的形式保存在符号表中,正确设计和维护
符号表;
4.对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误
提示,保证顺利完成整个源程序的词法分析;
2.实验步骤
1.词法分析规则
<标识符 >::=< 字母 >|< 标识符 ><字母 >|< 标识符 ><数字 >
<常数 >::=< 数字 >|< 数字序列 ><数字 >
<数字序列 >:: =<数字序列 ><数字 >|< 数字 >|<.>
<字母 >::=a|b|c|⋯⋯|x|y|z
<数字 >::=0|1|2|3|4|5|6|7|8|9
<运算符 >::=< 关系运算符 >|< 算运算符 >|< 运算符 >|< 位运算符 >|< 运算符 >
<算数运算符 >:: =+|-|*|/|...|--
<关系运算符 >:: =<|>|!=|>=|<=|==
<运算符 >::=&&| || |!
<位运算符 >::=&| | |!
<运算符 >::==|+=|-=|/=|*=
<分界符 >:: = ,|;|(|)|{|}|:| // |/**/
<保留字 >:: = main|if|else|while|do|for|...|void
2.符号的
符号种符号种
main0>26
if1>=27
else2<28
while3<=29
do4!30
for5!=31
switch 6 = 32 case 7 == 33 int 8 ( 34 double 9 ) 35 float 10 { 36 long 11 } 37 void 12 ; 38 + 13 :39 += 14 | 40 ++ 15 || 41 - 16 数字42 -= 17 标识符43 -- 18 , 44 & 19 // 45 && 20 /**/ 46 # 21
* 22
*= 23
/ 24
/= 25
3.状态转换图
空白
字母
数字
/
+
!
>
<
,(&
:{;
其它字母与数字
非字母与数字
1 2
数字
非数字
4 3
其它
6 5
=
7
/ 8
*
9
其它11 10
= 12
+ 13
其它
15 14
=
16
其它
17 18
=
19
其它
20 21 ..
22 ..
33
34
4.算法分析
①词法分析器工作的第一步是输入源程序文本。为了更好地对单词
符号识别,把输入串预处理一下。预处理主要滤掉空格,跳过注释、换
行符等。
②对预处理后的输入串依次扫描单个字符,使用 if-while嵌套语句
和switch case 语句判断字符的类型,具体识别方法可看状态转换图。
有时为了确定词性,需要超前扫描,若超前扫描的字符对识别当前单词
无用处,则需要退还给输入串,以备识别下一单词字符时使用。
③若读入的字符与单词符号编码表的字符匹配不上,则报错,并输
出出错行数。对识别处的单词符号以(单词符号,种别码)二元式的形
式输出。
3.实验内容
1. 流程图
2.程序的变量与函数说明
(1)input
全局字符数组,用来存放输入串(2)word
全局字符数组,用来存放获取到的单词符号,限定长度为 8
(3)ch
全局字符变量,用来存放最新读入的字符
(4)syn
全局整型变量,表示单词符号的编码
(5)p
全局整型变量,表示当前字符在input 数组的位置
(6)m
全局整型变量,表示最新读入的字符在word 数组的下标
(7)line
全局整型变量,当前行数
(8)keyword
全局字符数组,存放关键字
(9)init()
获取输入串
(10)isKey()
判断关键字的函数,若参数数组中是关键字,则把 syn 置为该关键字对应的编码并返回 1,否则返回 0
(11)isLetter()
判断字母的函数,若参数字符是字母,则返回1,否则返回 0
(12)isDigit()
判断数字的函数,若参数字符是数字,则返回1,否则返回 0
(13)isSpace()
判断空白符的函数,若参数字符是空格、 TAB或换行符,则返回 1,否则返回 0
(14)scaner()