学号: 姓名:
实验三 识别无符号数的词法分析器程序设计
一、实验目的与要求
通过编写并上机调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将源程序分解成各类单词的词法分析方法。 二、实验重难点
DFA无符号数的词法分析器编码实现 三、实验内容与要求
1. 阅读实验案例,明确实验要求和程序实现方案; 2. 参考实验案例,完善该无符号数的词法分析器设计程序。 四、实验学时
2课时
五、实验设备与环境 C语言编译环境
六、实验案例
1. 无符号数的词法分析器原理
(1)正规式表示:Unsigned digital: d…d…d…dESd…d, it includes four regular expressions: dd* 如:5 56 567 d*.dd* 如:.5 5.6 5.67 d*ESdd* 如:E5 E+56 5E-67
d*.dd*ESdd* 如:.5E5 5.65E+56 5.4E-67 while
VT={0, ···,9, ·,+,-,E} d =0|1| ···|9 S = +|-|ε
(2)NFA表示:
(3)经过NFA转DFA和DFA的化简后得到无符号数的DFA表示:
班级:
学号: 姓名:
2.设计要求
选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。
输入:由无符号数和+,-,*,/, ( , ) 构成的算术表达式,如1.5E+2-100。 输出:对识别出的每一单词均单行输出其类别码。 单词符号 无符号数 + - * / ( ) 如1 (对应1.5E+2)
3 (对应-) 1 (对应100) 3、程序源代码:
类别码(CLASS) 1 2 3 4 5 6 7 单词值(VALUE) 数字值 + - * / ( ) 1.cpp
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) 1 2 3 4 5 6 7 8 单词值(VALUE) 数字值 无值 无值 无值 无值 无值 无值 该非法的字符串 2. 词法分析程序(c++语言版,保持良好的缩进关系,主函数不能改,只能改AssortIdentify()、Output()函数等相应的函数): #include #define M 101 //最多可输入的字符数 #define UNSIGNEDNUMBER 1 //无符号数 #define PLUS 2 //加号 #define SUBTRACT 3 //减号 #define MULTIPLY 4 //乘号 #define DIVIDE 5 //除号 #define LEFTBRACKET 6 //左括号 #define RIGHTBRACKET 7 //右括号 #define ILLEGAL 8 //非法的字符串 班级: 学号: 姓名: class AccidenceAnalysis //定义词法分析器类 { private: char testStr[M],*p; //私有数据 public: AccidenceAnalysis(); //构造函数,功能一般是对类做初始化 void InputStr(); //输入函数 void Output(int a,char *p1,char *p2); //输出函数 int IsAcceptantCharacter(char *p); //判断输入字符是否属于字符集 int IsOperator(char *p); //判断字符是否是字符集[+,-,*,/,(,)]中的字符 int IsUnsignedNum(char *p); //判断字符是否是0--9的整数 void AbnormityExamine(char a[]); //异常检测函数 void IdentifyOperator(char *p);//识别字符集[+,-,*,/,(,)]中的字符 void AssortIdentify(); //对输入字符分类识别 }; AccidenceAnalysis::AccidenceAnalysis() { int i; for(i=0;i void AccidenceAnalysis::InputStr() { cout<<\"\请按要求输入您要分析的语句,所输字符应在要求范围(不超过\"< testStr[i]=ch; i++; } AbnormityExamine(testStr); } void AccidenceAnalysis::AbnormityExamine(char a[]) { int j=0; char *ptr1,*ptr2; ptr1=a;//指向字符串数组a ptr2=a; while(*ptr2!='\\0') { 班级: 学号: 姓名: j++; if(!IsAcceptantCharacter(ptr2)) { cout<<\"\您输入的第\"< *ptr1=*ptr2; ptr1++; ptr2++; } } while(ptr1<=ptr2) { *ptr1='\\0'; ptr1++; } } void AccidenceAnalysis::Output(int a,char *p1,char *p2) { if(a!=ILLEGAL){ cout<<\"\类别码:\"<cout<<*p1; p1++; } } else{