天天看点

《编译原理》NFA的确定化及DFA的最小化

教材:姜淑娟,张辰,刘兵.编译原理及应用[M],北京:清华大学出版社,2016.

时间:2019年9月

实现语言:c++

联系邮箱:[email protected]

- NFA的确定化,Github代码地址

- DFA的最小化,Github代码地址

上课第二周左右,谢红侠老师布置了第一次加平时分作业,期间积极性并不高,虽然一直挂念着,最后还是拖到了9月底才完成。不过全部算法和内容皆是自己思考所得,还是感觉非常兴奋的!

【NFA的确定化】

思路:

  1. 存储NFA图结构使用状态邻接表,矩阵行列均为状态,对应元素为转移字符;
  2. 计算每个节点的e-closure时,使用一个队列维护,进行广度优先搜索(优先遍历相邻状态)
  3. 使用set容器存储状态集合、e闭包(方便插入去重)
  4. 迭代时,使用可变长数组vector。随着计算,不断扩充,直至指针指向末尾(无新集合加入),跳出循环

【运行结果】

《编译原理》NFA的确定化及DFA的最小化

【DFA的最小化】

思路:

  1. (关键)找到需要更新子集号的行,从该行往下的所有子集号加一,即可完成一次更新
  2. 使用数组v存储一遍搜寻时,是否有行需要更新子集(find(1)不返回末尾指针)
  3. 初始存储矩阵时需要存储初始子集状态

    注:最小化中1处思路关键,代码中以注释形式保留了编写时对于程序运行的cout输出观察,删去61行注释符号,即可看到。

【运行结果】

《编译原理》NFA的确定化及DFA的最小化

如果删去61行的注释再运行,可以分析出,程序是怎样执行了循环,最终找到需要开始往下更新子集号的行。话说。。。期间每一步调试都是用的加cout输出来分析。。调试过错并不愉悦。

继续阅读