【计算理论】下推自动机 PDA ( 设计下推自动机 | 上下文无关语法 CFG 等价于 下推自动机 PDA )(一)

简介: 【计算理论】下推自动机 PDA ( 设计下推自动机 | 上下文无关语法 CFG 等价于 下推自动机 PDA )(一)

I . 下推自动机 设计


设计下推自动机 , 可以识别 { w w R : w ∈ { 0 , 1 } ∗ } \{ ww^R : w \in \{ 0, 1\} ^* \}{ww

R

:w∈{0,1}

} 语言 ;



R RR 表示镜面反射 , 如果 w ww 是由 0 , 1 0 , 10,1 组成的字符串 011 011011 , 那么 w R w^Rw

R

 就是其镜面反射 100 100100 字符串 , 然后将 w ww 和 w R w^Rw

R

 串联在一起 , w w R = 011100 ww^R = 011100ww

R

=011100 ;



1 . 首先生成开始状态 ;


开始状态是接受状态 , 因为如果字符串是空字符串 , 空字符串的镜面反射还是空字符串 , 因此读取空字符串后的状态 , 是接受状态 , 开始状态其本身就是接受状态 ;

image.png




2 . 向栈底放入 字符 S SS , 用于作为栈底的标识 , 生成 ε , ε → S \varepsilon , \varepsilon \to Sε,ε→S 指令 ;



ε , ε → S \varepsilon , \varepsilon \to Sε,ε→S 指令包含 2 22 部分 : 读取字符 , 和 栈内操作 ;


读取字符 : 指的是读取的带子上的字符串 , ε , ε → S \varepsilon , \varepsilon \to Sε,ε→S 中前面的 ε \varepsilonε 指的是从带子上读取 ε \varepsilonε ;


栈内操作 : 使用某个字符 替换 栈顶字符 ; ε , ε → S \varepsilon , \varepsilon \to Sε,ε→S 中后面的 ε → S \varepsilon \to Sε→S 指的是使用 S SS 字符替换栈顶的空字符 ε \varepsilonε ;


image.png



3 . 镜面反射的前半个镜面 :



0 00 入栈 : 每读取一个 0 00 , 就将 0 00 放入栈中 , 生成指令 0 , ε → 0 0, \varepsilon \to 00,ε→0 ;


1 11 入栈 : 每读取一个 1 11 , 就将 1 11 放入栈中 , 生成指令 1 , ε → 1 1, \varepsilon \to 11,ε→1 ;

image.png




4 . 跳转到新的状态 , 在新的状态执行 后半个镜面的操作 :



无条件跳转就是读取 ε \varepsilonε , 并且栈中元素保持不变 , 即使用 ε \varepsilonε 替换栈顶的 ε \varepsilonε ;


生成的指令为


ε , ε → ε \varepsilon , \varepsilon \to \varepsilon

ε,ε→ε



当前的下推自动机 :



image.png


5 . 镜面反射的后半个镜面 :



0 00 出栈 : 每读取一个 0 00 , 从栈里拿走一个 0 00 , 生成指令 0 , 0 → ε 0, 0 \to \varepsilon0,0→ε ;


1 11 出栈 : 每读取一个 1 11 , 从栈里拿走一个 0 00 , 生成指令 1 , 1 → ε 1, 1 \to \varepsilon1,1→ε ;

image.png




6 . 栈清空 , 跳转到最后的 接受状态 : 上述出栈操作执行若干次后, 总能将栈内的字符取出完毕 , 只剩下一个 S SS 字符 , 该字符是栈底的标识 ; 此时将 S SS 字符从栈内取出即可 ;



生成如下指令 :


ε , S → ε \varepsilon , S \to \varepsilon

ε,S→ε


指令含义是 读取 ε \varepsilonε 字符 , 使用 ε \varepsilonε 字符替换栈中的 S SS 字符 ;



最后跳转到的状态是接受状态 ;



当前下推自动机为 :



目录
相关文章
|
9月前
【每日一题Day250】LC1253重构 2 行二进制矩阵 | 贪心模拟
【每日一题Day250】LC1253重构 2 行二进制矩阵 | 贪心模拟
62 0
|
机器学习/深度学习 人工智能 算法
Barrels (codeforces 1430B )(拆分思想和模拟控制)
Barrels (codeforces 1430B )(拆分思想和模拟控制)
66 0
成信大ENVI_IDL第一周实验测试:数组的简单运算+详细解析
成信大ENVI_IDL第一周实验测试:数组的简单运算+详细解析
109 0
|
算法 异构计算
通过状态机方法实现基于FPGA的维特比译码器,包含testbench测试文件
通过状态机方法实现基于FPGA的维特比译码器,包含testbench测试文件
173 0
|
存储 Go C语言
编译原理,C语言实现LR(0)分析(扩展文法的生成、项目集规范簇的生成、ACTION GOTO表的生成、句子的分析)
注:代码生成的项目集规范簇、ACTION GOTO表的顺序可能和课本、教材、参考答案的顺序不同,但这并不影响分析过程的正确性,毕竟机器是按规律办事的😄
603 0
编译原理,C语言实现LR(0)分析(扩展文法的生成、项目集规范簇的生成、ACTION GOTO表的生成、句子的分析)
微机原理与接口技术实验一:用汇编语言输出用_表示的菱形-Ss1Two
微机原理与接口技术实验一:用汇编语言输出用_表示的菱形-Ss1Two
1159 0
微机原理与接口技术实验一:用汇编语言输出用_表示的菱形-Ss1Two
|
Scala
spinal HDL - 11 - 使用状态机语法编写“1001“序列检测
spinal HDL - 11 - 使用状态机语法编写“1001“序列检测
453 0
spinal HDL - 11 - 使用状态机语法编写“1001“序列检测
|
编译器
HDLBits练习汇总-03-Verilog语言--模块层次结构(一)
HDLBits练习汇总-03-Verilog语言--模块层次结构
221 0
HDLBits练习汇总-03-Verilog语言--模块层次结构(一)
HDLBits练习汇总-03-Verilog语言--模块层次结构(二)
HDLBits练习汇总-03-Verilog语言--模块层次结构
461 0
HDLBits练习汇总-03-Verilog语言--模块层次结构(二)