实验3识别无符号数的词法分析器设计实现c汇总.docx
- 文档编号:8498901
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:16
- 大小:182.88KB
实验3识别无符号数的词法分析器设计实现c汇总.docx
《实验3识别无符号数的词法分析器设计实现c汇总.docx》由会员分享,可在线阅读,更多相关《实验3识别无符号数的词法分析器设计实现c汇总.docx(16页珍藏版)》请在冰豆网上搜索。
实验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类别码:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验3识别无符号数的词法分析器设计实现c 汇总 实验 识别 符号 词法 分析器 设计 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)