版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。版权
编译原理专栏收录该内容
0 篇文章0 订阅
订阅专栏
学习的时候总感觉这个遇到新的题目不会做,这里总结一下
整个流程是这样的
我们直接来看一个例子,使用上面的算法来实现我们最后的目标
(a|b)*ba(ab)*
我们先来画NFA
明确:开始状态和接受状态,终结状态要画两个圈,值得注意的是,由于*也可以代表出现了0次,10号状态也是接受状态
NFA画好了,我们继续采用子集构造算法,整个过程繁而不难
举个例子,对S1={1,2,3,5,8}
如果此时收到‘a’,我们可以轻易画出转移的路线
把他们合并起来,即S1通过a到S2={2,3,4,5,7,8}
如果此时收到’b’,同理画出路线
把他们合并起来,即S1通过b到S3={2,3,5,6,7,8,9}
Sab
S1={1,2,3,5,8}S2={2,3,4,5,7,8}S3={2,3,5,6,7,8,9}
S2={2,3,4,5,7,8}S2={2,3,4,5,7,8}S3={2,3,5,6,7,8,9}
S3={2,3,5,6,7,8,9}S4={2,3,4,5,7,8,10,11,14}S3={2,3,5,6,7,8,9}
S4={2,3,4,5,7,8,10,11,14}S5={2,3,4,5,7,8,12}S3={2,3,5,6,7,8,9}
S5={2,3,4,5,7,8,12}S2={2,3,4,5,7,8}S6={2,3,5,6,7,8,9,11,13,14}
S6={2,3,5,6,7,8,9,11,13,14}S5={2,3,4,5,7,8,12}S3={2,3,5,6,7,8,9}
Sab
S1S2S3
S2S2S3
S3S4S3
S4S5S3
S5S2S6
S6S5S3
画出我们的DFA即可
只要记住对每个状态我们都要询问从a可以走到哪,从b可以走到哪,这样状态就不会遗漏
我们要给接受状态画两个圈圈,S4、S6包含我们的接受状态
结束了吗?还没有,我们要用Hopcroft最小化子集的算法
这个