实验3识别无符号数的词法分析器设计实现c++.docx

上传人:b****2 文档编号:20152954 上传时间:2023-04-25 格式:DOCX 页数:19 大小:201.06KB
下载 相关 举报
实验3识别无符号数的词法分析器设计实现c++.docx_第1页
第1页 / 共19页
实验3识别无符号数的词法分析器设计实现c++.docx_第2页
第2页 / 共19页
实验3识别无符号数的词法分析器设计实现c++.docx_第3页
第3页 / 共19页
实验3识别无符号数的词法分析器设计实现c++.docx_第4页
第4页 / 共19页
实验3识别无符号数的词法分析器设计实现c++.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

实验3识别无符号数的词法分析器设计实现c++.docx

《实验3识别无符号数的词法分析器设计实现c++.docx》由会员分享,可在线阅读,更多相关《实验3识别无符号数的词法分析器设计实现c++.docx(19页珍藏版)》请在冰豆网上搜索。

实验3识别无符号数的词法分析器设计实现c++.docx

实验3识别无符号数的词法分析器设计实现c++

实验三识别无符号数的词法分析器程序设计

一、实验目的与要求

通过编写并上机调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将源程序分解成各类单词的词法分析方法。

二、实验重难点

DFA无符号数的词法分析器编码实现

三、实验内容与要求

1.阅读实验案例,明确实验要求和程序实现方案;

2.参考实验案例,完善该无符号数的词法分析器设计程序。

四、实验学时

2课时

五、实验设备与环境

C语言编译环境

六、实验案例

1.无符号数的词法分析器原理

(1)正规式表示:

Unsigneddigital:

d…d…d…dESd…d,itincludesfourregularexpressions:

dd*如:

556567

d*.dd*如:

.55.65.67

d*ESdd*如:

E5E+565E-67

d*.dd*ESdd*如:

.5E55.65E+565.4E-67

while

VT={0,···,9,·,+,-,E}

d=0|1|···|9

S=+|-|ε

(2)NFA表示:

(3)经过NFA转DFA和DFA的化简后得到无符号数的DFA表示:

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个非终态都应该给出相应的判断。

单词符号

类别码(CLASS)

单词值(VALUE)

无符号数

1

数字值

+

2

无值

-

3

无值

*

4

无值

/

5

无值

6

无值

7

无值

非法的字符串

8

该非法的字符串

2.词法分析程序(c++语言版,保持良好的缩进关系,主函数不能改,只能改AssortIdentify()、Output()函数等相应的函数):

#include

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

testStr[i]='\0';//\0是C++中字符串的结尾标志,存储在字符串的结尾。

p=&testStr[0];//指针P指向字符数组首元素

}

voidAccidenceAnalysis:

:

InputStr()

{

cout<<"\t请按要求输入您要分析的语句,所输字符应在要求范围(不超过"<

";

charch;

inti=0;

while((ch=cin.get())!

='\n')//cin.get()是保留回车在输入流队列中的.而cin是丢弃回车的.

{

testStr[i]=ch;

i++;

}

AbnormityExamine(testStr);

}

voidAccidenceAnalysis:

:

AbnormityExamine(chara[])

{

intj=0;

char*ptr1,*ptr2;

ptr1=a;//指向字符串数组a

ptr2=a;

while(*ptr2!

='\0')

{

j++;

if(!

IsAcceptantCharacter(ptr2))

{

cout<<"\t您输入的第"<

"\

<<"将被跳过."<

ptr2++;

continue;//结束本次循环,继续下次循环,并且进行条件判断;

}

else

{

*ptr1=*ptr2;

ptr1++;

ptr2++;

}

}

while(ptr1<=ptr2)

{

*ptr1='\0';

ptr1++;

}

}

voidAccidenceAnalysis:

:

Output(inta,char*p1,char*p2)

{if(a!

=ILLEGAL){

cout<<"\t类别码:

"<

";

while(p1<=p2)

{

cout<<*p1;

p1++;

}

}else{

cout<<"\t类别码:

"<

";

while(p1<=p2)

{

cout<<*p1;

p1++;

}

cout<

}

}

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:

时间:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 起诉状

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1