文章目录- I . 上下文无关语法 ( CFG ) 转为 下推自动机 ( PDA )
- II . 下推自动机 ( PDA ) 三个状态
- III . 下推自动机 ( PDA )
状态
- IV . 下推自动机 ( PDA )
状态
- V . 下推自动机 ( PDA )
状态
- VI . 下推自动机 ( PDA ) 指令分解
- VII . 最终转换成的 下推自动机 ( PDA ) 结果
I . 上下文无关语法 ( CFG ) 转为 下推自动机 ( PDA )
上下文无关语法 ( CFG ) :
将上述 上下文无关语法 ( CFG ) 转为 下推自动机 ;
II . 下推自动机 ( PDA ) 三个状态
该 自动机 共包含
个状态 ,
,
,
, 最后一个状态是 可接受状态 ;
III . 下推自动机 ( PDA )
状态
1 . 首先在 栈顶 放入
字符 , 用于当做栈底的标识 ;
生成指令 :
;
开始状态
状态 , 读取
指令 , 读取空字符 , 使用
替换栈顶的空字符 , 就是将
放入栈中 ;
状态跳转 : 之后跳转到
状态 ;
当前的 下推自动机 ( CFG ) 设计 :
IV . 下推自动机 ( PDA )
状态
1 .
状态下 在栈中模仿 上下文无关语法 ( CFG ) 的规则替换 ;
上下文无关语法 ( CFG ) :
2 . 对照上述 上下文无关语法 ( CFG ) , 逐条生成指令 :
①
对应的指令 :
, 读取
时 , 使用
替换栈顶的
; 即如果栈顶是
, 使用
替换栈顶的
;
②
对应的指令 :
, 读取
时 , 使用
替换栈顶的
; 即如果栈顶是
, 使用
替换栈顶的
;
③
对应的指令 :
, 读取
时 , 使用
替换栈顶的
; 即如果栈顶是
, 使用
替换栈顶的
;
④
对应的指令 :
, 读取
时 , 使用
替换栈顶的
; 即如果栈顶是
, 使用
替换栈顶的
;
⑤ 如果栈上有终端字符
, 要将栈里的终端字符
移除 , 对应指令是
, 如果读取到字符
时 , 从栈顶将字符
移除 ;
⑥ 如果栈上有终端字符
, 要将栈里的终端字符
移除 , 对应指令是
, 如果读取到字符
时 , 从栈顶将字符
移除 ;
V . 下推自动机 ( PDA )
状态
1 .
状态 :
在
状态下 , 将栈内的除
外所有的字符都移除完毕 , 开始向
状态跳转 ;
此时需要生成指令
, 读取 空字符
, 使用 空字符
替换栈顶的
字符 , 此时栈清空了 ;
VI . 下推自动机 ( PDA ) 指令分解
1 . 非法指令分解
上述生成的
两个指令是不合法的 , 在栈中 , 一个字符 ( 或空字符串
) 只能由 一个字符 ( 或空字符串
) 替换 ;
上述不合法的规则 , 多个字符替换栈顶的一个字符 , 需要进行分解操作 ;
2 .
指令分解流程 :
①
状态 跳转到 新的状态
, 跳转读取的指令时
, 读取空字符 , 然后使用
替换栈顶的
字符 ;
②
状态 跳转到 新的状态
, 跳转读取的指令时
, 读取空字符 , 然后使用
替换栈顶的
字符 , 相当于在栈中放入了
字符 ;
③
状态 跳转到 原来的状态
, 跳转读取的指令时
, 读取空字符 , 然后使用
替换栈顶的
字符 , 相当于在栈中放入了
字符 ;
分解
后的
个指令 :
上述三个指令都是合法的 , 上述
个指令 串联后的效果等价于
操作 , 等价于上下文无关语法的
规则效果 ;
3 .
指令分解流程 :
①
状态 跳转到 新的状态
, 跳转读取的指令时
, 读取空字符 , 然后使用
替换栈顶的
字符 ;
②
状态 跳转到 原来的状态
, 跳转读取的指令时
, 读取空字符 , 然后使用
替换栈顶的
字符 , 相当于在栈中放入了
字符 ;
分解
后的
个指令 :
上述
个指令都是合法的 , 上述
个指令 串联后的效果等价于
指令 , 等价于上下文无关语法的
规则效果 ;
VII . 最终转换成的 下推自动机 ( PDA ) 结果
最终的 上下文无关语法 ( CFG ) 转为的 下推自动机 ( PDA ) 样式 :
上下文无关语法 ( CFG ) 与 下推自动机 ( PDA ) 是等价的 , 给定一个 下推自动机 ( PDA ) , 构造 上下文无关语法 ( CFG ) , 该语法生成的语言 , 就是该 下推自动机 ( PDA ) 所认识的语言 ;