实验3__识别无符号数的词法分析器设计实现c 课件 下载本文

内容发布更新时间 : 2024/5/19 2:20:54星期一 下面是文章的全部内容请认真阅读。

班级:

学号: 姓名:

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

一、实验目的与要求

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

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 using namespace std;

#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 //非法的字符串