实验一 词法分析
1.实验目的
(1)根据 PL/0 语言的文法规范,编写PL/0语言的词法分析程序;或者调研词法分析程序的自动生成工具LEX或FLEX,设计并实现一个能够输出单词序列的词法分析器。
(2) 通过设计调试词法分析程序,实现从源程序中分出各种单方法;加深对课堂教学的理解;提高词法分析方法的实践能力。
(3)掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的法。
(4)掌握词法分析的实现方法。
(5)上机调试编出的词法分析程序。
2.实验内容
已给 PL/0 语言文法,输出单词符号(关键字、专用符号以及其它标记)。
把词法分析器设计成一个独立一遍的过程。
词法分析器的输出形式采用二元式序列,即:
(单词种类, 单词的值)。
3.实验步骤
(1)写出各个表达式的正则式
关键字的正则式
标识符的正则式
常数的正则式
运算符的正则式
界符的正则式
(2)根据正则式画出NFA
利用以上三条规则对r进行分裂:
(3)根据确定化的NFA画出DFA,并对DFA化简
根据化简规则发现B,D和C,E可以合并
简化后的DFA为:
(4)画出程序的算法流程图
(5)编写代码并测试结果
代码放在附录中(实验总结之后)
4.实验总结
(1)通过先写出正则式到NFA到DFA再到画出程序的流程图,一步一步的优化自己的编程流程,可以在自己脑海中形成清晰的框架,不会出现一些大的方向上的判断错误。
(2)在程序编写时,用到了C++自带的库函数strtok,可以将字符串按照给定的多个一位分割符进行分割,将界符,运算符和其他区分开,便于遍历。在调试程序过程中,一开始在多位运算符号的判定出现问题,字符串数组的下标的值未能及时修改。之后调用修改下标函数专门对下标进行修改。
(3)通过这次实验理解了从正则式到最简DFA的每一步的含义。正规式是正规集的表现形式,通过正规式更好的人工设计成NFA(NFA与正规式的等价性),根据NFA运用子集法转换成DFA,解决了更容易编程问题(DFA和NFA的等价性),最后用最小化简法对DFA进行化简,以达到最简的效果,有利于编程实现。
(4)通过这次实验对于之前学到的词法分析有了进一步的了解,加深了对于词法分析的步骤的理解与领悟。对于今后对编译原理的学习有很大的帮助。
5.附录(实验代码)