词法分析中重要的一步是NFA的确定化,一般是通过子集法来确定化!并且,有定理:设L是由一NFA接受的正规集,则存在一个DFA接受L。
子集法的算法如下:
设NFA为M=(K,Σ,f,S0,Z),则构造相应的DFA M′=(Q,Σ,f′,I0,F)
1取I0=S0;
2对于状态集Q中任一尚未标记的状态qi={Si1,Si2,…,Sim},Sik∈K,做:
(1) 标记qi;
(2) 对于每个a∈Σ,置
T=f({Si1,Si2,…,Sim},a)
qj=εCLOSURE(T)
(3) 若qj不在Q中,则将qj作为一个未加标记的状态添加到Q中,且把状态转移f′(qi,a)=qj添加到M′。
3重复进行步骤2,直到Q中不再含有未标记的状态为止。对于由此构造的Q,我们把那些至少含有一个Z中的元素的qi作为M′的终态。
#include
节点类函数实现:
#include"StateTransitionDiagram.h"
#include
NFA转DFA主要代码:
#include"StateTransitionDiagram.h"
#include
#include
#include

代码的实现用到了很多STL里面的类库,STL确实很强大,节省了很多的开发时间,灵活使用STL需要更多的实践经验。编译原理解释了程序的执行原理,如果能理解透彻其中的深层次原理,对编程本身也是一种很大的提升,如果能自己去构造一个编译器,亲身去实现其中的算法,可以想象。不过这确实需要很大的耐心,对编程能力也有很高的要求!少年,任重而道远,加油吧!