文章目录
- 一、推广型的非确定性有限自动机 ( GNFA ) 引入
- 二、推广型的非确定性有限自动机 ( GNFA ) 删除状态
- 三、确定性有限自动机 ( DFA ) 转为 正则表达式
- 四、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 1 ) 添加开始状态 S S S 和结束状态 T T T
- 五、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 2 2 2 删除方法
- 六、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 2 2 2 信息梳理
- 七、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 2 2 2 : 1 1 1 -> 2 2 2 -> 3 3 3 生成信息 1 1 1 -> 3 3 3
- 八、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 2 2 2 : 3 3 3 -> 2 2 2 -> 3 3 3 生成信息 3 3 3 -> 3 3 3
- 九、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 2 2 2 阶段性结果
- 十、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 3 ) 删除 状态 1 1 1 信息梳理
- 十一、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 3 ) 删除 状态 1 1 1 : 3 3 3 -> 1 1 1 -> 3 3 3 生成信息 3 3 3 -> 3 3 3
- 十二、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 3 ) 删除 状态 1 1 1 : S S S -> 1 1 1 -> 3 3 3 生成信息 S S S -> 3 3 3
- 十三、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 2 , 1 2 , 1 2,1 阶段性结果
- 十四、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 4 ) 删除 状态 3 3 3 信息梳理
- 十五、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 4 ) 删除 状态 3 3 3 : S S S -> 3 3 3 -> T T T 生成信息 S S S -> T T T
- 十六、确定性有限自动机 ( DFA ) 转为 正则表达式 总结
一、推广型的非确定性有限自动机 ( GNFA ) 引入
1 . 给定一个自动机 , 必有一个正则表达式可以表示其所识别的语言 ;
2 . 引入 推广型的非确定性有限自动机 ( GNFA ) : 首先要构造一个推广的一般型的非确定性有限自动机 , 每次消除一个状态 , 最后只剩下两个状态 , 此时箭头上的正则表达式就是最终的正则表达式 ;
上述自动机是一个 推广型的非确定性有限自动机 ( GNFA ) , 箭头上 不是单个字符 或 空字符 , 而是 正则表达式 ;
3 . 推广型的非确定性有限自动机 ( GNFA ) 中的推广的体现 :
① 非确定性有限自动机 ( NFA ) : 箭头上 只能出现 字符 , 空字符串 , 2 2 2 种输入 , 不能出现其它输入内容 ;
② 推广型的非确定性有限自动机 ( GNFA ) : 箭头上 可以出现 字符 , 空字符串 , 空集 , 正则表达式 , 4 4 4 种输入 ;
4 . 推广型的非确定性有限自动机 ( GNFA ) 与 非确定性有限自动机 ( NFA ) 是等价的 ;
二、推广型的非确定性有限自动机 ( GNFA ) 删除状态
给定一个 推广型的非确定性有限自动机 ( GNFA ) , 找到一个正则表达式 , 代表给定自动机的语言 ;
1 . 需求描述 : 上述自动机中 , R 1 , R 2 , R 3 , R 4 R_1 , R_2, R_3, R_4 R1,R2,R3,R4 都是正则表达式 ;
删除 q 0 q_0 q0 状态 : 目前希望能删除 自动机中的 q 0 q_0 q0 状态 , 删除 q 0 q_0 q0 之后 , 会省略一部分语言 , 这里 省略了 R 1 , R 2 , R 3 R_1 , R_2 , R_3 R1,R2,R3 ;
语言要求 : 将 q 0 q_0 q0 状态删除后 , 不影响整个自动机所接受的语言 , 那么需要将省略的部分语言 , 补充到 R 4 R_4 R4 中 ;
2 . R 1 , R 2 , R 3 R_1 , R_2 , R_3 R1,R2,R3 关系分析 :
① R 2 R_2 R2 星运算 : R 2 R_2 R2 是一个循环 , q 0 q_0 q0 接受 R 2 R_2 R2 后 , 仍然保持 q 0 q_0 q0 状态 , 这里的该循环的正则表达式表示为 ( R 2 ) ∗ (R_2)^* (R2)∗ ;
② R 1 R_1 R1 与 ( R 2 ) ∗ (R_2)^* (R2)∗ 串联运算 : R 1 R_1 R1 与 ( R 2 ) ∗ (R_2)^* (R2)∗ 是串联关系 , 表示为 R 1 ( R 2 ) ∗ R_1 (R_2)^* R1(R2)∗
③ 与 R 3 R_3 R3 的串联运算 : R 1 ( R 2 ) ∗ R_1 (R_2)^* R1(R2)∗ 与 R 3 R_3 R3 是串联关系 , 表示为 R 1 ( R 2 ) ∗ R 3 R_1 (R_2)^* R_3 R1(R2)∗R3 ;
3 . 并运算 : R 1 ( R 2 ) ∗ R 3 R_1 (R_2)^* R_3 R1(R2)∗R3 与 R 4 R_4 R4 是并集关系 , 都是 q i q_i qi 到 q j q_j qj 的输入的正则表达式 ;
4 . 两个正则表达式并运算表示为 : ( R 1 ( R 2 ) ∗ R 3 ) ∪ R 4 ( R_1 (R_2)^* R_3 ) \cup R_4 (R1(R2)∗R3)∪R4
三、确定性有限自动机 ( DFA ) 转为 正则表达式
上图中的自动机是一个 3 3 3 个状态的 确定性有限自动机 ( DFA ) ;
将上述 确定性有限自动机 ( DFA ) 转为正则表达式 ;
四、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 1 ) 添加开始状态 S S S 和结束状态 T T T
1 . 添加开始和结束状态 :
① 添加开始状态 : 添加新的开始状态 S S S , 使用 ε \varepsilon ε 箭头指向当前 确定性有限自动机 ( DFA ) 的 开始状态 ;
② 添加结束状态 : 再次添加一个 接受状态 , 从 确定性有限自动机 ( DFA ) 的接受状态 指向该新的结束状态 , 该新添加的结束状态 是 接受状态 ;
2 . 确定性有限自动机 ( DFA ) 转为 正则表达式 思想 : 逐步删除 1 , 2 , 3 1,2,3 1,2,3 状态 , 每次删除一个状态 , 生成新的正则表达式 , 最后就剩下 开始状态 S S S , 和结束状态 T T T , 最后剩下的就是 S S S 到 T T T 状态的正则表达式 , 也是自动机的正则表达式 ;
五、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 2 2 2 删除方法
1 . 删除 2 2 2 状态 :
① 信息抽取转移 : 找到 与 2 2 2 状态 所有的相关的信息 , 添加到其它的箭头上 , 如果没有创建一个新的箭头 ;
② 2 2 2 状态的输入和输出 : 哪些状态 有箭头 输入到 2 2 2 状态 , 2 2 2 状态 有哪些箭头 输出到了其它状态 ;
③ 信息转移 : 将每个输入 和 每个输出的信息全部转移 , 一条信息也不能遗漏 ;
④
2
2
2 状态的输入输出统计 : 有
3
3
3 条输入 ,
2
2
2 条输出 ; 其中有 一条输入输出是从
2
2
2 状态输出指向 它自己 , 共有
4
4
4 个箭头信
息 ; 外部输入有 2 条 , 外部输出 有
1
1
1 条 , 需要生成的箭头信息个数是
外
部
输
入
条
数
×
外
部
输
出
条
数
外部输入条数 \times 外部输出条数
外部输入条数×外部输出条数 ;
2 . 2 2 2 状态的循环 ( 1 1 1 输入 1 1 1 输出 ) : 2 2 2 状态下读取 b b b , 仍然回到 2 2 2 状态 ; 这 1 1 1 个输入 , 1 1 1 个输出 , 是从 2 2 2 状态输出到 2 2 2 状态 , 这是一个 星计算 ; 使用 b ∗ b^* b∗ 表示 ;
六、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 2 2 2 信息梳理
状态 2 2 2 信息梳理如下 ;
1 . 2 2 2 状态信息输入 :
S S S 状态 读取 ε \varepsilon ε 跳转到 1 1 1 状态 ;
3 3 3 状态 读取 a a a 跳转到 1 1 1 状态 ;
2 . 2 2 2 状态信息输出 :
1 1 1 状态读取 ( a b ∗ a ) ∪ b (ab^*a) \cup b (ab∗a)∪b 正则表达式 跳转到 3 3 3 状态 ;
3 . 箭头信息生成个数 : 外部输入有 2 条 , 外部输出 有 1 1 1 条 , 需要生成的箭头信息条数 :
外 部 输 入 条 数 × 外 部 输 出 条 数 = 2 × 1 = 2 外部输入条数 \times 外部输出条数 = 2 \times 1 = 2 外部输入条数×外部输出条数=2×1=2
七、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 2 2 2 : 1 1 1 -> 2 2 2 -> 3 3 3 生成信息 1 1 1 -> 3 3 3
1 . 1 1 1 -> 2 2 2 -> 3 3 3 状态跳转 :
1 1 1 状态读取 a a a 跳转到 2 2 2 状态 : 这里是状态 2 2 2 的一条输入 , 使用 a a a 表示 ;
2 2 2 状态读取 b b b 跳转到 2 2 2 状态 : 这是无限的星计算 , 使用 b ∗ b^* b∗ 表示 ;
2 2 2 状态读取 a a a 跳转到 3 3 3 状态 : 这里是状态 2 2 2 的一条输出 , 使用 a a a 表示 ;
2 . 3 3 3 个正则表达式是串联关系 ;
中间经历的过程是 1 1 1 状态输入 a a a 跳转到 2 2 2 状态 , 2 2 2 本身可以有无限个星计算 , 2 2 2 状态输入 a a a 跳转到 3 3 3 状态 ;
使用正则表达式表示为 a b ∗ a ab^*a ab∗a ;
4 . 生成箭头信息 :
1 1 1 状态下 , 读取 a b ∗ a ab^*a ab∗a 正则表达式 , 可以跳转到 3 3 3 状态 ;
将 a b ∗ a ab^*a ab∗a 正则表达式 与 1 1 1 到 3 3 3 跳转箭头上的 b b b 进行并计算 , 得到
( a b ∗ a ) ∪ b (ab^*a) \cup b (ab∗a)∪b
这是 1 1 1 跳转到 3 3 3 的正则表达式 ;
八、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 2 2 2 : 3 3 3 -> 2 2 2 -> 3 3 3 生成信息 3 3 3 -> 3 3 3
1 . 3 3 3 -> 2 2 2 -> 3 3 3 状态跳转 :
3 3 3 状态读取 b b b 跳转到 2 2 2 状态 : 这里是状态 2 2 2 的一条输入 , 使用 b b b 表示 ;
2 2 2 状态读取 b b b 跳转到 2 2 2 状态 : 这是无限的星计算 , 使用 b ∗ b^* b∗ 表示 ;
2 2 2 状态读取 a a a 跳转到 3 3 3 状态 : 这里是状态 2 2 2 的一条输出 , 使用 a a a 表示 ;
2 . 3 3 3 个正则表达式是串联关系 ;
中间经历的过程是 3 3 3 状态输入 b b b 跳转到 2 2 2 状态 , 2 2 2 本身可以有无限个星计算 , 2 2 2 状态输入 a a a 跳转到 3 3 3 状态 ;
三者串联关系 , 使用正则表达式表示为 b b ∗ a bb^*a bb∗a ;
即 3 3 3 状态下 , 读取 b b ∗ a bb^*a bb∗a 正则表达式 , 可以跳转到 3 3 3 状态 ;
3 . 生成箭头信息 :
给 3 3 3 状态添加一个箭头指向它自身 , 箭头的接收的正则表达式是
b b ∗ a bb^*a bb∗a
这是 1 1 1 跳转到 3 3 3 的正则表达式 ; 表示 3 3 3 状态下接收 b b ∗ a bb^*a bb∗a 正则表达式 , 仍然跳转到 3 3 3 状态 ;
九、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 2 2 2 阶段性结果
删除 2 2 2 状态结果 :
十、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 3 ) 删除 状态 1 1 1 信息梳理
状态 1 1 1 信息梳理如下 ;
1 . 1 1 1 状态信息输入 :
S S S 状态 读取 ε \varepsilon ε 跳转到 1 1 1 状态 ;
3 3 3 状态 读取 a a a 跳转到 1 1 1 状态 ;
2 . 1 1 1 状态信息输出 :
1 1 1 状态读取 ( a b ∗ a ) ∪ b (ab^*a) \cup b (ab∗a)∪b 正则表达式 跳转到 3 3 3 状态 ;
3 . 箭头信息生成个数 : 外部输入有 2 条 , 外部输出 有 1 1 1 条 , 需要生成的箭头信息条数 :
外 部 输 入 条 数 × 外 部 输 出 条 数 = 2 × 1 = 2 外部输入条数 \times 外部输出条数 = 2 \times 1 = 2 外部输入条数×外部输出条数=2×1=2
十一、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 3 ) 删除 状态 1 1 1 : 3 3 3 -> 1 1 1 -> 3 3 3 生成信息 3 3 3 -> 3 3 3
1 . 3 3 3 -> 1 1 1 -> 3 3 3 状态跳转 :
3 3 3 状态 读取 a a a 跳转到 1 1 1 状态 , 正则表达式 表示为 a a a ;
1 1 1 状态 读取 ( a b ∗ a ) ∪ b (ab^*a) \cup b (ab∗a)∪b 正则表达式 跳转到 3 3 3 , 正则表达式 表示为 ( a b ∗ a ) ∪ b (ab^*a) \cup b (ab∗a)∪b ;
2 . 正则表达式 : 上述两个正则表达式是串联关系 , 正则表达式表示为 a ( ( a b ∗ a ) ∪ b ) a ( (ab^*a) \cup b ) a((ab∗a)∪b)
3 . 生成新的箭头信息 :
新增加的 3 3 3 状态下读取 a ( ( a b ∗ a ) ∪ b ) a ( (ab^*a) \cup b ) a((ab∗a)∪b) 跳转到 3 3 3 ;
与原来的 3 3 3 读取 b b ∗ a bb^*a bb∗a 跳转到 3 3 3 是并联关系 ,
最终的 3 3 3 读取一个正则表达手 跳转到 3 3 3 状态 , 的正则表达式为
( a ( ( a b ∗ a ) ∪ b ) ) ∪ ( b b ∗ a ) ( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a ) (a((ab∗a)∪b))∪(bb∗a)
十二、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 3 ) 删除 状态 1 1 1 : S S S -> 1 1 1 -> 3 3 3 生成信息 S S S -> 3 3 3
1 . S S S -> 1 1 1 -> 3 3 3 状态跳转 :
S S S 状态 读取 ε \varepsilon ε 跳转到 1 1 1 状态 , 正则表达式 表示为 ε \varepsilon ε ;
1 1 1 状态 读取 ( a b ∗ a ) ∪ b (ab^*a) \cup b (ab∗a)∪b 正则表达式 跳转到 3 3 3 , 正则表达式 表示为 ( a b ∗ a ) ∪ b (ab^*a) \cup b (ab∗a)∪b ;
上述两个正则表达式是串联关系 , 正则表达式表示为 ε ∪ ( ( a b ∗ a ) ∪ b ) \varepsilon \cup ( (ab^*a) \cup b ) ε∪((ab∗a)∪b) , 其中 ε \varepsilon ε 可以省略 , 最终表示为 ( a b ∗ a ) ∪ b (ab^*a) \cup b (ab∗a)∪b
2 . 新增加 S S S 状态 到 3 3 3 状态之间的跳转 : S S S 状态下读取 ( a b ∗ a ) ∪ b (ab^*a) \cup b (ab∗a)∪b 正则表达式 , 跳转到 3 3 3 状态 ;
十三、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 2 , 1 2 , 1 2,1 阶段性结果
十四、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 4 ) 删除 状态 3 3 3 信息梳理
状态 3 3 3 信息梳理 :
1 . 3 3 3 状态信息输入 :
S S S 状态 读取 ( a b ∗ a ) ∪ b (ab^*a) \cup b (ab∗a)∪b 跳转到 3 3 3 状态 ;
3 3 3 状态 读取 ( a ( ( a b ∗ a ) ∪ b ) ) ∪ ( b b ∗ a ) ( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a ) (a((ab∗a)∪b))∪(bb∗a) 跳转到 3 3 3 状态 ;
2 . 3 3 3 状态信息输出 :
3 3 3 状态 读取 ( a ( ( a b ∗ a ) ∪ b ) ) ∪ ( b b ∗ a ) ( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a ) (a((ab∗a)∪b))∪(bb∗a) 跳转到 3 3 3 状态 ;
3 3 3 状态读取 ε \varepsilon ε 正则表达式 跳转到 T T T 状态 ;
3 . 箭头信息生成个数 : 自身循环有一个 , 从 3 3 3 状态 自身输出到输入 , 外部输入有 1 条 , 外部输出 有 1 1 1 条 , 需要生成的箭头信息条数 :
外 部 输 入 条 数 × 外 部 输 出 条 数 = 1 × 1 = 1 外部输入条数 \times 外部输出条数 = 1 \times 1 = 1 外部输入条数×外部输出条数=1×1=1
十五、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 4 ) 删除 状态 3 3 3 : S S S -> 3 3 3 -> T T T 生成信息 S S S -> T T T
1 . S S S -> 3 3 3 -> T T T 状态跳转 :
S S S 状态 读取 ( a b ∗ a ) ∪ b (ab^*a) \cup b (ab∗a)∪b 跳转到 3 3 3 状态 ;
3 3 3 状态 读取 ( a ( ( a b ∗ a ) ∪ b ) ) ∪ ( b b ∗ a ) ( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a ) (a((ab∗a)∪b))∪(bb∗a) 跳转到 3 3 3 状态 , 星计算 , 表示成 ( a ( ( a b ∗ a ) ∪ b ) ) ∪ ( b b ∗ a ) ∗ ( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a )^* (a((ab∗a)∪b))∪(bb∗a)∗
3 3 3 状态读取 ε \varepsilon ε 正则表达式 跳转到 T T T 状态 ;
上述 3 3 3 个正则表达式是串联关系 , 正则表达式表示为 :
( ( a b ∗ a ) ∪ b ) ∘ ( ( a ( ( a b ∗ a ) ∪ b ) ) ∪ ( b b ∗ a ) ) ∗ ( (ab^*a) \cup b ) \circ ( \quad ( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a ) \quad )^* ((ab∗a)∪b)∘((a((ab∗a)∪b))∪(bb∗a))∗
2 . 新增加 S S S 状态 到 T T T 状态之间的跳转 : S S S 状态下读取 ( ( a b ∗ a ) ∪ b ) ∘ ( ( a ( ( a b ∗ a ) ∪ b ) ) ∪ ( b b ∗ a ) ) ∗ ( (ab^*a) \cup b ) \circ ( \quad ( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a ) \quad )^* ((ab∗a)∪b)∘((a((ab∗a)∪b))∪(bb∗a))∗ 正则表达式 , 跳转到 T T T 状态 ;
十六、确定性有限自动机 ( DFA ) 转为 正则表达式 总结
由上述示例可知 , 任何 确定性有限自动机 都可以转为 正则表达式 , 非确定性有限自动机 与 确定性有限自动机 又是等价的 , 因此 有限自动机 都可以转为 正则表达式 ;