词法分析器Word文档格式.docx
- 文档编号:15717098
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:24
- 大小:414.90KB
词法分析器Word文档格式.docx
《词法分析器Word文档格式.docx》由会员分享,可在线阅读,更多相关《词法分析器Word文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
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语言词法分析程序的有限自动机(状态转换图表示)
状态转换图如下页所示:
数字
其他
.
.
八.实验结果(测试用例源程序,运行结果截图)
1、测试用例程序
begin
"
string"
;
if(num1>
num2)
studn&
t=num2=16;
texttttt4=0XA&
if(num1==num2)
peak1=a+b*c/d;
peak2**;
grade<
grade2;
for(i=1;
i<
=2;
)
name1>
=name2;
grade1!
=grade2;
sdkfajslw;
text1=9;
text2=32.25;
text3=3.34125e3;
text4=0XA6;
BEGIN
<
a>
"
stringfgdf"
<
end
end;
2、运行结果:
2.1初始页面
2.2读入字符串
2.3词法分析结果(包括错误检查)
九.实验体会(词法分析程序修改的地方,解决问题的方法、心得体会等)
本次词法分析器课程设计,写了两个周,终于完成了,写完了之后看着自己做的词法分析器心里还是有一点小小的满足感。
毕竟是写完了,感觉不到有啥困难,但回想一下整个词法分析器的设计过程,其实问题接踵而至,搞得我焦头烂额,尤其是一个小的功能写错了之后,反复的查找错误,调试程序,周六周日晚上为了解决掉它加班到晚上三四点,最后发现三个小时左右也就顺利完成了三种类型左右的单词识别,我想这就是以后一个作为程序员该有的工作责任吧--加班加点!
在第一节实验课老师给我们下发词法分析器的课程设计任务时,老师给我们讲解了好多次才听懂实验到底是干嘛的,顿时感觉好难,该怎么写,一节课在思考词法分析器如何设计,于是很纠结。
于是晚上回到宿舍,我把课本第四章仔细的看了两遍,感觉有点头绪,整个的目标与方向有大概的了解,但是具体的数据结构还不是很清晰,这是遇到的第一个问题,于是我在想,要不直接把字符串到数组里,然后对数组进行挨个处理,方便简单,于是我就确定了大致的数据结构。
后来就是处理空格和回车的问题,因为读到数组里面字符串包含空格和回车,于是我设置全局变量指针来定位数组,同时每判断一个字符就做是否为空处理,如果为空,全局变量加一后移,回车我当做一个字符处理,每碰到一个回车,全局变量加一后移,进行下一个分析。
接下来我又碰到一个问题,就是如何保存识别出来的单词?
我想了一下,结果是通过临时数组来存储结果,每识别一个单词就将单词的输出,临时数组在接着进行使用,可是,问题来了,需要识别类别号呀,需要和识别出来的单词匹配出来呀?
想了一下,这点好解决,提前设置类型号和单词的匹配,通过设置全局变量类型号来对应匹配,这样,每识别一个就输出一个,问题就解决了。
通过前期的一系列的工作,词法分析器写的还算顺利进行,关系运算符和算术运算符、标点符号、字符型常量、字符串常量顺利的写完了。
这时候我就在写关键字和标示符的识别,我在想是要分开识别还是统一识别,最后我决定还是统一识别城标示符,然后设置一个关键字字符串数组对应匹配,若匹配成功,则是关键字,否则,就是标示符。
于是问题就解决了。
后来我感觉难一点的地方,就是各种类型数的识别,这可花了我好长的时间,每一个类型单个识别倒是简单,看着自动机画的图,所以还是咬着牙用一个程序段搞定,一个大致简要的方向就是:
先是预判断是否是十进制,然后如果存在点,就是小数,在判断是否存在e,存在就是科学计数法。
十六进制写起来容易一点。
眼看自己的程序就快搞定了,心理还是挺激动,但是问题还没有结束,数制要换成二进制,这有花费了好几个小时仔细思考,字符转数字,数字转二进制,又查找了几个简便的函数一点一点的解决了。
最后,到了程序的最后一部分,就是识别行号和错误类型,我想老师请教了好几次,通过老师的讲解,我有了大致的方向。
行号问题我通过设置变量来标示,在扫描字符串时,每识别一个回车,变量加一,这样问题就解决了。
最难的部分我感觉是识别错误,尤其是关键字拼写错误,我想了好久不过还算是顺利解决了,重点就是关键字拼写错误,主要是大小写拼写错误,我通过识别出来的字符串,如果字符串与关键字数组匹配出现相同,就没有拼写错误,如果没有匹配相同,通过发字符串全部转换为小写,然后再次匹配,如果匹配了,就说明错在拼写错误。
标示符字数超限问题,通过判断临时数组的长度就解决了。
标示符中存在非法字符问题,如果是在标示符中出现的非法字符,现存起来,把它的类型设置为错误类型,这样就解决了。
每一种错误设置一种对应的错误类型,这样问题就解决了。
通过两个星期的词法分析设计,不仅仅是完成了任务,而且编程能力到提高,解决问题的能力得到了加强,所以以后还要再接再厉,提升自己。
附录:
#include<
cstdio>
cstring>
#include<
fstream>
stdlib.h>
iostream>
cmath>
usingnamespacestd;
charprog[800],bring[20];
charch;
inthanghao=1;
intLei_Xing,p,m=0,n,sum=0;
char*keyword[8]={"
begin"
if"
for"
read"
do"
end"
next"
write"
};
voidkexuejishufa_er()
{
charabc[10000];
charabc1[10000];
inti=0;
intj=0;
intk=0;
for(j=0;
bring[j]!
='
e'
j++)
{
abc[i++]=bring[j];
}
for(j=j+1;
j<
m-1;
abc1[k]=bring[j];
k++;
abc[i]='
\0'
abc1[k]='
doublesmall=atof(abc);
//转换成double型小数
doublesmall2=atof(abc1);
for(intjj=1;
jj<
=small2;
jj++)
small=small*10;
cout<
十进制数:
small<
"
charzhengshubufen[10000];
//整数
doublea;
longvalue;
value=(long)small;
a=small-value;
itoa(value,zhengshubufen,2);
//将value转为存成2进制之字串
zhengshubufen;
if(a>
0.0)
'
.'
while(a>
a=a*2;
(long)a;
a=a-long(a);
}
voidxiaoshu_er()
doublesmall=atof(bring);
zhengshubufen<
voidshi_er(intx)//十进制转换为二进制
chara[100000];
itoa(x,a,2);
printf("
%s"
a);
voidshiliu_er()
for(inti=2;
bring[i]!
i++)
if(bring[i]=='
0'
0000"
elseif(bring[i]=='
1'
0001"
2'
0010"
3'
0011"
4'
0100"
5'
0101"
6'
0110"
7'
0111"
8'
1000"
9'
1001"
A'
1010"
B'
1011"
C'
1100"
D'
1101"
E'
1110"
else
1111"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 词法 分析器
![提示](https://static.bdocx.com/images/bang_tan.gif)