}
}
intAccidenceAnalysis:
:
IsOperator(char*p)
{
charch=*p;
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')')
return1;
else
return0;
}
intAccidenceAnalysis:
:
IsUnsignedNum(char*p)
{
charch=*p;
if('0'<=ch&&ch<='9')
return1;
else
return0;
}
intAccidenceAnalysis:
:
IsAcceptantCharacter(char*p)
{
charch=*p;
if(IsOperator(p)||IsUnsignedNum(p)||ch=='E'||ch=='.')
return1;
elsereturn0;
}
voidAccidenceAnalysis:
:
IdentifyOperator(char*p)
{
charch=*p;
switch(ch)
{
case'+':
Output(PLUS,p,p);break;
case'-':
Output(SUBTRACT,p,p);break;
case'*':
Output(MULTIPLY,p,p);break;
case'/':
Output(DIVIDE,p,p);break;
case'(':
Output(LEFTBRACKET,p,p);break;
case')':
Output(RIGHTBRACKET,p,p);break;
default:
break;
}
}
voidAccidenceAnalysis:
:
AssortIdentify()
{
while(*p!
='\0')
{//从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=='\0')
{
Output(UNSIGNEDNUMBER,p1,--p);//拼数,从指针p1到指针p之间的所有的字符串
p++;
continue;
}
elseif(*p=='E')//情况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);
p++;
continue;
}
elseif(*p=='+'||*p=='-')
{
p++;
while(IsUnsignedNum(p))
p++;
Output(UNSIGNEDNUMBER,p1,--p);
p++;
continue;
}
}else{
p++;
Output(ILLEGAL,p1,--p);
p++;
continue;
}
////////////////////////////////////////
}
elseif(*p=='.')//情况2.2.3:
从状态B出发,如果输入为'.',到达状态C。
{
p++;
while(IsUnsignedNum(p))//情况2.2.3.1:
从状态C出发,如果输入为d,到达状态E
p++;
if(*p=='\0')//情况2.2.3.1.1:
如果遇到字符串结束标志,到达终态E,可以判断为无符号数
{
Output(UNSIGNEDNUMBER,p1,--p);
p++;
continue;
}
elseif(*p=='E')//情况2.2.3.1.2:
从状态E出发,如果输入E,到达状态D,重复刚才状态D之后的判断。
(D之后如果输入d、+、-,且后面一直都是输入d,则到达终态F,可以判断是无符号数。
(因为s为+、-、))
{
///////////////////////////////////////
char*p1=p;
p++;
if(*p1=='+'|*p=='-'){
if(IsUnsignedNum(p))
{
while(IsUnsignedNum(p))
p++;
Output(UNSIGNEDNUMBER,p1,--p);
p++;
continue;
}
elseif(*p=='+'||*p=='-')
{
p++;
while(IsUnsignedNum(p))
p++;
Output(UNSIGNEDNUMBER,p1,--p);
p++;
continue;
}
}else{
p++;
Output(ILLEGAL,p1,--p);
p++;
continue;
}
///////////////////////////////////////////
}
}
}
if(*p=='.')//情况2.2:
从状态A出发,如果输入为'.'。
到达状态C
{
p++;
if(IsUnsignedNum(p))//情况2.2.1:
C到E
{
p++;
while(IsUnsignedNum(p))
p++;
if(*p=='\0')//情况2.2.1.1:
C到E后到终态
{
Output(UNSIGNEDNUMBER,p1,--p);
p++;
continue;
}
elseif(*p=='E')//情况2.2.1.2:
E到D
{
p++;
if(IsUnsignedNum(p))//情况2.2.1.2:
D到H
{
while(IsUnsignedNum(p))
p++;
Output(UNSIGNEDNUMBER,p1,--p);
p++;
continue;
}
elseif(*p=='+'||*p=='-')//情况2.2.1.2:
D到F
{
p++;
while(IsUnsignedNum(p))//情况2.2.1.2:
F到H
p++;
Output(UNSIGNEDNUMBER,p1,--p);
p++;
continue;
}
}
}
}
}
/////////////////////////////////
elseif(*p=='E')//情况2.1.2:
B之后如果输入E,到达状态D,需要进一步判断。
{
char*p1=p;
p++;
if(*p1=='+'|*p=='-'){
if(IsUnsignedNum(p))
{
while(IsUnsignedNum(p))
p++;
Output(UNSIGNEDNUMBER,p1,--p);
p++;
continue;
}
elseif(*p=='+'||*p=='-')
{
p++;
while(IsUnsignedNum(p))
p++;
Output(UNSIGNEDNUMBER,p1,--p);
p++;
continue;
}
}else{
p++;
Output(ILLEGAL,p1,--p);
p++;
continue;
}
}
//////////////////////////////////////
}
cout<cout<<"\t单词分析完毕."<}
intmain()
{
AccidenceAnalysisaccidenceanalysis;
accidenceanalysis.InputStr();
accidenceanalysis.AssortIdentify();
return0;
}
3.测试数据及运行结果(可截图):
截图上要有自己的姓名学号信息
测试用例1运行截图:
0.23E-12-E12
测试用例2运行截图:
0.23E*12/a(0.23E-12)E*50.23E+*5.*5
4.实验结果分析与心得体会
教师评语:
是否完成实验程序的预备设计?
是:
不是:
程序能否正常运行?
是:
不是:
有无测试数据及结果分析是:
不是:
是否在本次规定时间完成所有项目?
是:
不是:
实验成绩等级:
教师签名:
N0:
时间: