【计算理论】计算理论总结 ( 上下文无关文法 CFG 转为下推自动机 PDA 示例 1 ) ★★
参考博客 :
- 【计算理论】上下文无关语法 ( 语法组成 | 规则 | 语法 | 语法示例 | 约定的简写形式 | 语法分析树 )
- 【计算理论】上下文无关语法 ( 代数表达式 | 代数表达式示例 | 确定性有限自动机 DFA 转为 上下文无关语法 )
- 【计算理论】上下文无关语法 CFG ( CFG 设计示例 | CFG 歧义性 | Chomsky 范式 | 上下文无关语法 转为 Chomsky 范式 )
- 【计算理论】下推自动机 PDA 及 计算示例
- 【计算理论】下推自动机 PDA ( 设计下推自动机 | 上下文无关语法 CFG 等价于 下推自动机 PDA )
- 【计算理论】上下文无关语法 ( CFG ) 转为 下推自动机 ( PDA )
- 【计算理论】下推自动机 PDA ( 上下文无关语言 CFL 的 泵引理 | 泵引理反证示例 | 自动机扩展 )
一、上下文无关文法 CFG 转为下推自动机 PDA 流程
上下文无关文法 CFG 转为下推自动机 PDA 流程 :
① 开始状态 : 开始状态 q s t a r t \rm q_{start} qstart , 跳转到 q l o o p \rm q_{loop} qloop 状态的指令 ε , ε → K \rm \varepsilon , \varepsilon \to K ε,ε→K , 使用 K \rm K K 替换栈内空字符 ε \varepsilon ε , 即将 K \rm K K 放入栈中 ;
② 循环状态 : q l o o p \rm q_{loop} qloop 状态的指令都是从本状态指向本状态 , 生成两种指令 , 一种是基本指令 , 一种是终端字符指令 ;
基本指令 S → a T b ∣ b \rm S \to aTb|b S→aTb∣b 生成为 ε , S → a T b \rm \varepsilon , S \to aTb ε,S→aTb 和 ε , S → b \rm \varepsilon , S \to b ε,S→b 两条指令 , 前面都是读取空字符作为栈读取的信息 ;
终端字符指令 , 如果存在终端字符 a \rm a a 和 b \rm b b , 那么生成 a , a → ε \rm a, a \to \varepsilon a,a→ε 和 b , b → ε \rm b, b \to \varepsilon b,b→ε 两条指令 , 含义是读取栈顶 a \rm a a 字符 , 将该字符使用空字符替代 , 即从栈中删除该字符 ;
③ 接受状态 : q l o o p \rm q_{loop} qloop 状态跳转到 q a c c e p t \rm q_{accept} qaccept 指令是 ε , K → ε \rm \varepsilon , K \to \varepsilon ε,K→ε , 栈顶读取到 K \rm K K 字符删除 ;
④ 拆分指令 : 在循环状态 q l o o p \rm q_{loop} qloop 中的基本指令中存在多字符指令 , 如 ε , S → a T b \rm \varepsilon , S \to aTb ε,S→aTb , S \rm S S 读取到空字符 ε \varepsilon ε , 使用 a T b \rm aTb aTb 字符替换栈顶的 S \rm S S 字符 , 这是 3 3 3 个字符 , 肯定不行 , 需要逐个放进去 , 先放 b \rm b b , 再放 T \rm T T , 最后放 a \rm a a ;
最终分解为
ε , S → b \rm \varepsilon , S \to b ε,S→b 读取空字符放入 b \rm b b 到栈顶 ,
ε , ε → T \rm \varepsilon , \varepsilon \to T ε,ε→T 读取空字符放入 T \rm T T 到栈顶 ,
ε , ε → a \rm \varepsilon , \varepsilon \to a ε,ε→a 读取空字符放入 a \rm a a 到栈顶 ;
二、上下文无关文法 CFG 转为下推自动机 PDA 示例 1
将上下文无关语法 ( CFG ) 转为下推自动机 ( PDA ) :
S → a T b ∣ b \rm S \to aTb | b S→aTb∣b
T → T a ∣ ε \rm T \to Ta|\varepsilon T→Ta∣ε
上下文无关文法 CFG 转为下推自动机 PDA 流程 :
① 开始状态 : 开始状态 q s t a r t \rm q_{start} qstart , 跳转到 q l o o p \rm q_{loop} qloop 状态的指令 ε , ε → K \rm \varepsilon , \varepsilon \to K ε,ε→K , 使用 K \rm K K 替换栈内空字符 ε \varepsilon ε , 即将 K \rm K K 放入栈中 ;
② 循环状态 : q l o o p \rm q_{loop} qloop 状态的指令都是从本状态指向本状态 , 生成两种指令 , 一种是基本指令 , 一种是终端字符指令 ;
基本指令 S → a T b ∣ b \rm S \to aTb|b S→aTb∣b 生成为 ε , S → a T b \rm \varepsilon , S \to aTb ε,S→aTb 和 ε , S → b \rm \varepsilon , S \to b ε,S→b 两条指令 , 前面都是读取空字符作为栈读取的信息 ;
基本指令 T → T a ∣ ε \rm T \to Ta|\varepsilon T→Ta∣ε 生成为 ε , T → T a \rm \varepsilon , T \to Ta ε,T→Ta 和 ε , T → ε \rm \varepsilon , T \to \varepsilon ε,T→ε 两条指令 , 前面都是读取空字符作为栈读取的信息 ;
终端字符指令 , 如果存在终端字符 a \rm a a 和 b \rm b b , 那么生成 a , a → ε \rm a, a \to \varepsilon a,a→ε 和 b , b → ε \rm b, b \to \varepsilon b,b→ε 两条指令 , 含义是读取栈顶 a \rm a a 字符 , 将该字符使用空字符替代 , 即从栈中删除该字符 ;
③ 接受状态 : q l o o p \rm q_{loop} qloop 状态跳转到 q a c c e p t \rm q_{accept} qaccept 指令是 ε , K → ε \rm \varepsilon , K \to \varepsilon ε,K→ε , 栈顶读取到 K \rm K K 字符删除 ;
④ 拆分指令 : 在循环状态 q l o o p \rm q_{loop} qloop 中的基本指令中存在多字符指令 , 如 ε , S → a T b \rm \varepsilon , S \to aTb ε,S→aTb , S \rm S S 读取到空字符 ε \varepsilon ε , 使用 a T b \rm aTb aTb 字符替换栈顶的 S \rm S S 字符 , 这是 3 3 3 个字符 , 肯定不行 , 需要逐个放进去 , 先放 b \rm b b , 再放 T \rm T T , 最后放 a \rm a a ;
ε , S → a T b \rm \varepsilon , S \to aTb ε,S→aTb 最终分解为 :
ε , S → b \rm \varepsilon , S \to b ε,S→b 读取 S \rm S S 字符放入 b \rm b b 到栈顶替换 S \rm S S 字符 ,
ε , ε → T \rm \varepsilon , \varepsilon \to T ε,ε→T 读取空字符放入 T \rm T T 到栈顶 ,
ε , ε → a \rm \varepsilon , \varepsilon \to a ε,ε→a 读取空字符放入 a \rm a a 到栈顶 ;
ε , T → T a \rm \varepsilon , T \to Ta ε,T→Ta 最终分解为 :
ε , T → a \rm \varepsilon , T \to a ε,T→a , 读取 T \rm T T 字符放入 a \rm a a 到栈顶替换 T \rm T T 字符 ,
ε , ε → T \rm \varepsilon , \varepsilon \to T ε,ε→T , 读取空字符放入 T \rm T T 到栈顶 ;
最终的下推自动机样式
文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。
原文链接:hanshuliang.blog.csdn.net/article/details/111469412
- 点赞
- 收藏
- 关注作者
评论(0)