实验3识别无符号数的词法分析器设计实现c++Word格式.docx
- 文档编号:3499368
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:19
- 大小:201.06KB
实验3识别无符号数的词法分析器设计实现c++Word格式.docx
《实验3识别无符号数的词法分析器设计实现c++Word格式.docx》由会员分享,可在线阅读,更多相关《实验3识别无符号数的词法分析器设计实现c++Word格式.docx(19页珍藏版)》请在冰点文库上搜索。
2.设计要求
选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。
输入:
由无符号数和+,-,*,/,(,)构成的算术表达式,如1.5E+2-100。
输出:
对识别出的每一单词均单行输出其类别码。
单词符号
类别码(CLASS)
单词值(VALUE)
无符号数
1
数字值
+
2
-
3
*
4
/
5
(
6
)
7
如1(对应1.5E+2)
3(对应-)
1(对应100)
3、程序源代码:
4、运行结果:
测试用例1:
0.23E-12-E12
结论:
(1)案例中的程序只给出了A到B\C及其后续通路的程序,没有给出A到D及其后续通路的程序。
因此不能识别E12是一个无符号数。
测试用例2:
0.23E*12/a(0.23E-12)
(2)案例中的程序只给出了若输入的字符串符合无符号数的DFA语法规则,将该无符号数识别出来,并没有给出当输入的字符串不符合无符号数的DFA语法规则时,如何处理。
请将案例程序按下表规则补充完整。
错误提示有两层含义,一个是输入字符不属于输入字母表,一个是输入字符正确但不合语法规则,这两种错误都应该予以检测并给出相应的处理。
但案例程序只检测了第一种错误。
七、无符号数的词法分析器设计的完善
1.设计要求,对案例程序的BUG进行完善:
(1)案例中的程序只给出了A到B\C及其后续通路的程序,没有给出A到D及其后续通路的程序,请将A到D及其后续通路的程序给出。
(2)案例中只给出了若输入的字符串符合无符号数的DFA语法规则,将该无符号数识别出来,并没有给出当输入的字符串不符合无符号数的DFA语法规则时如何处理。
注意:
3个非终态都应该给出相应的判断。
无值
非法的字符串
8
该非法的字符串
2.词法分析程序(c++语言版,保持良好的缩进关系,主函数不能改,只能改AssortIdentify()、Output()函数等相应的函数):
#include<
iostream>
usingnamespacestd;
#defineM101//最多可输入的字符数
#defineUNSIGNEDNUMBER1//无符号数
#definePLUS2//加号
#defineSUBTRACT3//减号
#defineMULTIPLY4//乘号
#defineDIVIDE5//除号
#defineLEFTBRACKET6//左括号
#defineRIGHTBRACKET7//右括号
#defineILLEGAL8//非法的字符串
classAccidenceAnalysis//定义词法分析器类
{
private:
chartestStr[M],*p;
//私有数据
public:
AccidenceAnalysis();
//构造函数,功能一般是对类做初始化
voidInputStr();
//输入函数
voidOutput(inta,char*p1,char*p2);
//输出函数
intIsAcceptantCharacter(char*p);
//判断输入字符是否属于字符集
intIsOperator(char*p);
//判断字符是否是字符集[+,-,*,/,(,)]中的字符
intIsUnsignedNum(char*p);
//判断字符是否是0--9的整数
voidAbnormityExamine(chara[]);
//异常检测函数
voidIdentifyOperator(char*p);
//识别字符集[+,-,*,/,(,)]中的字符
voidAssortIdentify();
//对输入字符分类识别
};
AccidenceAnalysis:
:
AccidenceAnalysis()
inti;
for(i=0;
i<
M;
i++)
testStr[i]='
\0'
;
//\0是C++中字符串的结尾标志,存储在字符串的结尾。
p=&
testStr[0];
//指针P指向字符数组首元素
}
voidAccidenceAnalysis:
InputStr()
cout<
<
"
\t请按要求输入您要分析的语句,所输字符应在要求范围(不超过"
M<
)之内,并按回车键运行:
charch;
inti=0;
while((ch=cin.get())!
='
\n'
)//cin.get()是保留回车在输入流队列中的.而cin是丢弃回车的.
{
testStr[i]=ch;
i++;
}
AbnormityExamine(testStr);
AbnormityExamine(chara[])
intj=0;
char*ptr1,*ptr2;
ptr1=a;
//指向字符串数组a
ptr2=a;
while(*ptr2!
j++;
if(!
IsAcceptantCharacter(ptr2))
{
cout<
\t您输入的第"
j<
个字符"
*ptr2<
不可以被此程序识别!
\
<
将被跳过."
endl;
ptr2++;
continue;
//结束本次循环,继续下次循环,并且进行条件判断;
}
else
*ptr1=*ptr2;
ptr1++;
while(ptr1<
=ptr2)
*ptr1='
ptr1++;
Output(inta,char*p1,char*p2)
{if(a!
=ILLEGAL){
cout<
\t类别码:
a<
单词值:
while(p1<
=p2)
*p1;
p1++;
}else{
非法的字符串:
intAccidenceAnalysis:
IsOperator(char*p)
charch=*p;
if(ch=='
+'
||ch=='
-'
*'
/'
('
)'
return1;
else
return0;
IsUnsignedNum(char*p)
if('
0'
=ch&
&
ch<
9'
IsAcceptantCharacter(char*p)
if(IsOperator(p)||IsUnsignedNum(p)||ch=='
E'
.'
elsereturn0;
IdentifyOperator(char*p)
switch(ch)
case'
Output(PLUS,p,p);
break;
Output(SUBTRACT,p,p);
Output(MULTIPLY,p,p);
Output(DIVIDE,p,p);
Output(LEFTBRACKET,p,p);
Output(RIGHTBRACKET,p,p);
default:
break;
AssortIdentify()
while(*p!
{//从DFA的初始状态出发进行分类识别
if(IsOperator(p))//情况1:
从状态A出发,判断输入是否为符号,如果是,则不是无符号数,而是运算符,调用运算符识别函数IdentifyOperator(char*p)识别运算符。
IdentifyOperator(p++);
continue;
}
elseif(IsUnsignedNum(p)||*p=='
)//情况2:
从状态A出发,判断输入是否为为数字或者'
char*p1=p;
//拼数,从指针p1到指针p之间的所有的字符串
if(IsUnsignedNum(p))//情况2.1:
从状态A出发,如果输入为数字,到达状态B
while(IsUnsignedNum(p))//情况2.1.1:
B之后如果输入为数字,且后面都是数字,则到达终态B,可以判定为无符号数。
p++;
if(*p=='
{
Output(UNSIGNEDNUMBER,p1,--p);
continue;
}
elseif(*p=='
)//情况2.1.2:
B之后如果输入E,到达状态D,需要进一步判断。
///////////////////////////////////////
char*p1=p;
p++;
if(*p1=='
|*p=='
){
if(IsUnsignedNum(p))//情况2.1.2.1:
D之后如果输入d、+、-,且后面一直都是输入d,则到达终态F,可以判断是无符号数。
(因为s为+、-、)
{
while(IsUnsignedNum(p))
p++;
Output(UNSIGNEDNUMBER,p1,--p);
continue;
}
elseif(*p=='
||*p=='
}
}else{
Output(ILLEGAL,p1,--p);
////////////////////////////////////////
)//情况2.2.3:
从状态B出发,如果输入为'
到达状态C。
while(IsUnsignedNum(p))//情况2.2.3.1:
从状态C出发,如果输入为d,到达状态E
if(*p=='
)//情况2.2.3.1.1:
如果遇到字符串结束标志,到达终态E,可以判断为无符号数
)//情况2.2.3.1.2:
从状态E出发,如果输入E,到达状态D,重复刚才状态D之后的判断。
(D之后如果输入d、+、-,且后面一直都是输入d,则到达终态F,可以判断是无符号数。
(因为s为+、-、))
///////////////////////////////////////
char*p1=p;
if(IsUnsignedNum(p))
{
while(IsUnsignedNum(p))
p++;
Output(UNSIGNEDNUMBER,p1,--p);
continue;
}
elseif(*p=='
}else{
Output(ILLEGAL,p1,--p);
///////////////////////////////////////////
if(*p=='
)//情况2.2:
从状态A出发,如果输入为'
。
到达状态C
p++;
if(IsUnsignedNum(p))//情况2.2.1:
C到E
while(IsUnsignedNum(p))
)//情况2.2.1.1:
C到E后到终态
)//情况2.2.1.2:
E到D
if(IsUnsignedNum(p))//情况2.2.1.2:
D到H
D到F
while(IsUnsignedNum(p))//情况2.2.1.2:
F到H
/////////////////////////////////
elseif(*p=='
)//情况2.1.2:
{
char*p1=p;
if(*p1=='
}else{
Output(ILLEGAL,p1,--p);
//////////////////////////////////////
\t单词分析完毕."
intmain()
AccidenceAnalysisaccidenceanalysis;
accidenceanalysis.InputStr();
accidenceanalysis.AssortIdentify();
return0;
3.测试数据及运行结果(可截图):
截图上要有自己的姓名学号信息
测试用例1运行截图:
测试用例2运行截图:
0.23E*12/a(0.23E-12)E*50.23E+*5.*5
4.实验结果分析与心得体会
教师评语:
是否完成实验程序的预备设计?
是:
不是:
程序能否正常运行?
是:
有无测试数据及结果分析是:
是否在本次规定时间完成所有项目?
实验成绩等级:
教师签名:
N0:
时间:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 识别 符号 词法 分析器 设计 实现 c+