之前提到了经过通过NFA来构造DFA(http://blog.csdn.net/betabin/article/details/8057787),现在继续来忽悠下,直接从正则表达式构造DFA。嗯,还有个附加的DFA极小化。
直接构造DFA,大致分为3步:构造语法分析树、计算followpos函数(难点)、生成DFA。
以正则表达式(a|b)*abb为例:
1、构造语法分析树:
这个不多说,看图应该就能明白:
(给每一个标号赋予一个独有的整数)
2、计算followpos函数:
首先需要计算一些辅助函数:nullable(n),firstpos(n),lastpos(n)→followpos(n)
(截图流又来了……)
嗯,这三个函数应该还是比较好理解的,nullable辅助计算first和last的。而firstpos(n)表示的就是该子表达式可能出现的首字符的标号(之前独一无二的整数)集合,同样lastpos则是可能的最后面字符的标号集合。(lastpos可以同理得到)