编译器-NFA转DFA

本文详细介绍了正则表达式中的NFA如何通过子集构造法转化为DFA。通过实例解析了NFA的E-closure操作以及转换过程中状态的确定,强调了DFA在编程实现上的优势。转换过程中可能出现的状态数量是指数级的,但通常并不需要所有可能的状态,且该转换工作在编译器设计时一次性完成。

NFA 转 DAF : subset construction(子集构造法)

对于一个正则表达式,虽然说NFA和DFA从input state走到final state总是能满足正则表达式的要求,但是NFA对于一个特定的例子可以有无限多中走法,而DFA对于一个特定的例子只有唯一的走法,所以DFA更利于编程转换成代码

转换的核心思想就是把NFA路线中的多个可能性的选择合并看作一个DFA state

q1 → d1
q2 → d2
(q1,q2) → d3
∅ → d4

可以看出NFA的2个state可以最多有4个DFA state

如果有3个NFA state 那么可以最多有8个DFA state 即:{q1,q2,q3}
{q1}        {q2}        {q3}        {q1,q2}        {q1,q3}        {q2,q3}        {q1,q2,q3}        {∅}
可以看出 这八个DFA state都是{q1,q2,q3}的子集 所以这也是为什么叫subset construction

总结 如果有n个NFA state 那么可以有至多2^N个DFA state

接下来看具体转换过程</

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值