@RunZhi
2017-05-02T09:51:16.000000Z
字数 1637
阅读 1532
编译原理
设计一个应用软件,以实现将正则表达式-->NFA--->DFA-->DFA最小化---词法分析程序
实验要求:
(1)要提供一个源程序编辑界面,让用户输入正则表达式(可保存、打开源程序)
(2)需要提供窗口以便用户可以查看转换得到的NFA(用状态转换表呈现即可)
(3)需要提供窗口以便用户可以查看转换得到的DFA(用状态转换表呈现即可)
(4)需要提供窗口以便用户可以查看转换得到的最小化DFA(用状态转换表呈现即可)
(5)需要提供窗口以便用户可以查看转换得到的词法分析程序(该分析程序需要用C语言描述)
(6)应该书写完善的软件文档
操作系统: Windows8.1
编程语言: Java
开发环境: NetBeans8.2
完成部分:(1)~(4)
本实验使用简易的图形界面
点击生成按钮,将各步骤生成的有限自动机显示出
(由于NFA存在空字符等其它显示不出的字符,因此NFA的显示中,只显示字符的十进制ASCII码。0代表空字符。
DEFOFSN类定义了相关的常数
InfixToPostfix定义了相关的中缀表达式转为后缀表达式的函数,但是在本实验该类并没有被使用
NFAGraphEdge,NFAGraphNode分别定义了NFA边和NFA结点
NFAGraph定义了NFA及其相关的函数
test为测试代码
NFA的构造使用了Thompson算法。具体来讲借助了一个符号栈和一个子NFA栈进行构造
算法简易描述如下
DFANode定义了DFA的结点
DFAGraph定义了相关DFA的结构和函数
partition定义了需要用在DFA最小化里的一些结构。
test为测试代码
DFA的构造大致如下:首先构造NFA,然后根据该NFA进行DFA构造。构造的算法为子集构造法。
算法的具体描述请参考其它资料。直观上讲,NFA的状态转移虽然是非确定性的,但是其转移所到的状态集合必然是其NFA结点集合的幂集的某个子集。因此NFA的非确定性转移可以看作在其幂集子集上的确定性转移,可以把这些子集看作是一个DFA结点。
DFA最小化使用了分割法。把DFA所有的结点分成一个个组,每个组里的DFA结点对任意的输入符号,转移到的状态也是同一组,即组内DFA结点互相不可区分。根据这些组重新构造一个DFA,该新的DFA中各个结点都是不等价的。
本实验完成了以下内容:正则表达式->NFA->DFA->DFA最小化