算法思路:
- 把正规式转换成DFA后的状态集划分成两个集合,终态组集合T(包含DFA的终态Y)和非终态组集合N(不包含DFA的终态Y),并把集合T和N加入集合C中。
- 对于集合C中每个状态集set,假设set中有n个状态s1,s2,......,sn,对于文法的所有终结符,识别一个终结符a后,转换到新的状态s1',s2',......,sn'。如果s1',s2',......,sn'属于C中的同一个状态集,则不必将set划分成不同的状态集。如果不属于C中的同一个状态集,就需要将set划分成不同的状态集。(划分方法:假设s1',s2',......,sk'中属于同一个状态集,则把s1,s2,......,sk划分成一个新的状态。不断使用该方法,直至所有的状态都被划分开)
- 如果状态集set被划分,则将set从集合C中删除,将所有划分后的状态集加入集合C中。
- 重复执行2和3,直至集合C中的所有状态集都不能被划分为止。对于集合C中的状态集,只需要使用其中的一个状态来代替整个状态集即可。
代码:
GrammarToNFA 参考:正规式转NFA
NfaToDfa参考: