1、设计有穷自动机 DFA 实现 C+简单程序的词法分析、扫描前面两篇(一、二)只是直观地 针对已明确给出的教学语言 Tiny 源程序进行直接的词法分析(其实根本就称不上),不具有一般性(下面这个针对 C+源程序的词法分析也相当单一,考虑面不足)。下面是我们的课程实验,需要结合课堂上学到的利用有限自动机 DFA 的方法来设计并分析源程序,提取出符合要求的 Token。根据老师给出的课件以及教材上的内容, 扫描程序(词法分析)有下面 3 种实现方式,前面两篇(一、二)就是属于“直接编写”这一类,而本文 则是“DFA” 这一类。1、 按实验要求(如下) ,目前只拙劣地实现了第(1)和(5)点。而且第(
2、1)点中有两个要求未能完成: 浮点数,因为包含单行、多行注释的 DFA 已经很混乱了,这部分暂时先不实现,考虑将来用“表驱动法” (即状 态转换表)来实现。 注释,与教材类似不打印单 行和多行注释,因此代 码实现 中少了处理注释的内容。实验中用到的 C+源程序与要求如下 图:2、对实验要求中的“样例程序”稍微修改了一下。 头文件 #include 被改为 #include “iostream.h“,即 iostream.h 是由双引号 “ 而不是尖括号 包 围的,实际上回到了 C 的代码规范。 这样修改是因为原本确定 DFA 时考虑不全面,忽略了“小于等于 =,判断 =,不等于 != ”这几种特殊情况,因 为他们会跟 = ! 这几个特殊字符造成二义性。 同时,C+ 中的 IO 有“ 与 中的 与代码中的 和 = 。其实,“iostream.h“也被作为字符串识别了,目前尚改进不了。 另外为了测试算术运算符, 对实验要求中的样例程序进 行了修改,程序按照 该样例作为输入,如下图加上了一个“i = i + 2;”语句:3、程序中的打印输出模仿了教材中的样例输出。 对于以上样例输入,最终程序 输出结果如下:4、针对该 C+源程序设计的 DFA 图大致如下:5、实现代码(Java)近来喜欢上了 Vim 的代码高亮,看着清晰明朗,下面是整个实现代码在 Vim 下的截图,文本代码在本文最后: