首页 > 代码库 > NFA 与 DFA 的转换
NFA 与 DFA 的转换
声明
本文是对编译原理中NFA到DFA的转换做的总结,该代码参考了编译原理中词法分析的相关内容.
转换方式
NFA即不确定有穷状态机,而DFA是确定有穷状态机。
从本质上讲NFA与利用其构造而成的DFA是等价的,但因为NFA某一状态离开的路径可能有多条,因此常常在构造出NFA后将前面的状态集合做一抽象以构建对于每一状态离开路径只有一条的DFA。
NFA到DFA的构造方法常用到两点,即子集构造法与闭包传递.
伪代码说明
1.0-closure(s) 能够从NFA的状态S开始只通过0转换到达的NFA的状态集合 2.0-closure(T) 能够从T中的某个NFA状态s开始只通过0转换到达的NFA的状态集合 3.move(T,a) 能够从T中某个状态s触发只通过标号为a的转换转换达到的NFA状态集合 /**子集构造法*/ NFA-DFA-CONVERT(nfa, dfa) s0 -> nfa的开始状态 U -> 0-closure(s0) push U into dfa without mark while ( T -> find one in dfa without mark){ mark T; for(every possible intput a) U‘ -> 0-closure(move(T, a)) if(U‘ is not in dfa) push U‘ into dfa without mark set dfa[T, a]->U‘ } /**计算0-closure(T)的闭包传递*/ CLOSURE(T) push all status in T into stack S push all status in T into U while(S is not empty){ t->pop one from S; for(每个从t状态能通过空串转换得到的状态U‘) if(U‘不在U中){ push U‘ into U; push U‘ into S; } } return U;
总结
dfa的每个状态是对nfa状态集合的二次抽象.以此达到每个状态只有一条离开路径.
NFA 与 DFA 的转换
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。