词法分析器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《编译原理》课程
实验报告
题目L语言的词法分析程序
专业计算机科学与技术
班级2014级
学号
姓名张衡
石河子大学信息学院计算机系
2016年10月30日
一. 实验序号:《编译原理》词法分析实验
二. 实验题目:L语言的词法分析程序
三. 实验日期: 2016年10月30日
四. 实验环境(操作系统,开发语言)
操作系统:Windows
开发语言:C
五. 实验要求
1)词法分析程序主要识别用L语言编写的源程序中的各类单词,并以所在
行号和二元式(单词类别,单词值)的形式输出
2)标识符类单词词法规则“以字母或下划线开头,后面可以跟字母、数字、
下划线”;“区分大小写字母“;”长度最多为8个字符“。
3)常量类单词分为数值型常量、字符型常量、字符串常量。
1.数值型常量分为整型常量和小数常量。整型常量有十进制(0-9组成)
和十六进制(0-9、A-F组成)两种;小数常量分为定点小数和科学
计数法两种,其中定点小数由0-9和一个小数点组成,科学记数法由
0-9、小数点和E组成。
2.字符型常量由一对<>带一个字符组成。
3.字符串常量由一对“”带一个或多个字符组成。
4)运算符有算术运算符(+、-、*、/、**);关系运算符(= =、>、>=、<、
<=、!=)。
5)分界符有;、,、和(、)。每条语句以;结束。
6)进行单词拼写错误检查,并输出错误信息和所在行号。
六. 实验步骤
1)用L语言编写测试用例源程序,用C语言编写词法分析程序。
2)运行词法分析程序,读入L语言的测试用例源程序,进行词法分析。
3)设立断点,单步运行词法分析程序,依次单个输出单词。分析和理解词
法分析程序,解释词法分析程序中的数据和变量变化的原因和输出结果。
4)根据上述“实验要求”修改或编写词法分析程序,同时也应修改L语言
测试用例源程序中的相应的单词。
5)运行修改后的词法分析程序,读入修改后的L语言测试用例源程序,进
行词法分析。
七.L语言词法分析程序的有限自动机(状态转换图表示)
状态转换图如下页所示:
.
数字
数字
其他
数字
X
非数字
数字
1
2
4
3
5
6
9
13
7
14
.
数字 其他
数字
e
8 1-9或A -F
其他
字母或者 _ 字母或者 _
其他
10
“
11
12
字符
”
其他
字符
15
<
字符
>
其他
=
16
其他
非=,字符
17
>
非=
=
18
其他
转下页
=
其他
=
19
23
3
25
22
2
24
28 6
21
!
=
非!
*
*
其他
0 27
30
32
34
36
—
非*
,
38
/
;
(
)
其他
其他
其他
其他
其他
其他
其他
八.实验结果(测试用例源程序,运行结果截图)
1、测试用例程序
begin
"string";
if(num1>num2)
studn&t=num2=16;
texttttt4=0XA&;
if(num1==num2)
peak1=a+b*c/d;
peak2**;
grade for(i=1;i<=2;) name1>=name2; grade1!=grade2; sdkfajslw; text1=9;text2=32.25;text3=3.34125e3; text4=0XA6; BEGIN end end; 2、运行结果: 2.1 初始页面 2.2读入字符串 2.3 词法分析结果(包括错误检查) 九.实验体会(词法分析程序修改的地方,解决问题的方法、心得体会等)本次词法分析器课程设计,写了两个周,终于完成了,写完了之后看着自己做的词法分析器心里还是有一点小小的满足感。毕竟是写完了,感觉不到有啥困难,但回想一下整个词法分析器的设计过程,其实问题接踵而至,搞得我焦头烂额,尤其是一个小的功能写错了之后,反复的查找错误,调试程序,周六周日晚上为了解决掉它加班到晚上三四点,最后发现三个小时左右也就顺利完成了三种类型左右的单词识别,我想这就是以后一个作为程序员该有的工作责任吧--加班加点! 在第一节实验课老师给我们下发词法分析器的课程设计任务时,老师给我们讲解了好多次才听懂实验到底是干嘛的,顿时感觉好难,该怎么写,一节课在思考词法分析器如何设计,于是很纠结。于是晚上回到宿舍,我把课本第四章仔细的看了两遍,感觉有点头绪,整个的目标与方向有大概的了解,但是具体的数据结构还不是很清晰,这是遇到的第一个问题,于是我在想,要不直接把字符串到数组里,然后对数组进行挨个处理,方便简单,于是我就确定了大致的数据结构。后来就是处理空格和回车的问题,因为读到数组里面字符串包含空格和回车,于是我设置全局变量指针来定位数组,同时每判断一个字符就做是否为空处理,如果为空,全局变量加一后移,回车我当做一个字符处理,每碰到一个回车,全局变量加一后移,进行下一个分析。接下来我又碰到一个问题,就是如何保存识别出来的单词?我想了一下,结果是通过临时数组来存