文章目录
参考博客 :
一、上下文无关文法 CFG 转为下推自动机 PDA 流程
上下文无关文法 CFG 转为下推自动机 PDA 流程 :
① 开始状态 : 开始状态
\rm q_{start} , 跳转到
\rm q_{loop} 状态的指令
\rm \varepsilon , \varepsilon \to K , 使用
\rm K 替换栈内空字符
\varepsilon , 即将
\rm K 放入栈中 ;
② 循环状态 :
\rm q_{loop} 状态的指令都是从本状态指向本状态 , 生成两种指令 , 一种是基本指令 , 一种是终端字符指令 ;
基本指令
\rm S \to aTb|b 生成为
\rm \varepsilon , S \to aTb 和
\rm \varepsilon , S \to b 两条指令 , 前面都是读取空字符作为栈读取的信息 ;
终端字符指令 , 如果存在终端字符
\rm a 和
\rm b , 那么生成
\rm a, a \to \varepsilon 和
\rm b, b \to \varepsilon 两条指令 , 含义是读取栈顶
\rm a 字符 , 将该字符使用空字符替代 , 即从栈中删除该字符 ;
③ 接受状态 :
\rm q_{loop} 状态跳转到
\rm q_{accept} 指令是
\rm \varepsilon , K \to \varepsilon , 栈顶读取到
\rm K 字符删除 ;
④ 拆分指令 : 在循环状态
\rm q_{loop} 中的基本指令中存在多字符指令 , 如
\rm \varepsilon , S \to aTb ,
\rm S 读取到空字符
\varepsilon , 使用
\rm aTb 字符替换栈顶的
\rm S 字符 , 这是
3 个字符 , 肯定不行 , 需要逐个放进去 , 先放
\rm b , 再放
\rm T , 最后放
\rm a ;
最终分解为
\rm \varepsilon , S \to b 读取空字符放入
\rm b 到栈顶 ,
\rm \varepsilon , \varepsilon \to T 读取空字符放入
\rm T 到栈顶 ,
\rm \varepsilon , \varepsilon \to a 读取空字符放入
\rm a 到栈顶 ;
二、上下文无关文法 CFG 转为下推自动机 PDA 示例 1
将上下文无关语法 ( CFG ) 转为下推自动机 ( PDA ) :
\rm S \to aTb | b\rm T \to Ta|\varepsilon上下文无关文法 CFG 转为下推自动机 PDA 流程 :
① 开始状态 : 开始状态
\rm q_{start} , 跳转到
\rm q_{loop} 状态的指令
\rm \varepsilon , \varepsilon \to K , 使用
\rm K 替换栈内空字符
\varepsilon , 即将
\rm K 放入栈中 ;
② 循环状态 :
\rm q_{loop} 状态的指令都是从本状态指向本状态 , 生成两种指令 , 一种是基本指令 , 一种是终端字符指令 ;
基本指令
\rm S \to aTb|b 生成为
\rm \varepsilon , S \to aTb 和
\rm \varepsilon , S \to b 两条指令 , 前面都是读取空字符作为栈读取的信息 ;
基本指令
\rm T \to Ta|\varepsilon 生成为
\rm \varepsilon , T \to Ta 和
\rm \varepsilon , T \to \varepsilon 两条指令 , 前面都是读取空字符作为栈读取的信息 ;
终端字符指令 , 如果存在终端字符
\rm a 和
\rm b , 那么生成
\rm a, a \to \varepsilon 和
\rm b, b \to \varepsilon 两条指令 , 含义是读取栈顶
\rm a 字符 , 将该字符使用空字符替代 , 即从栈中删除该字符 ;
③ 接受状态 :
\rm q_{loop} 状态跳转到
\rm q_{accept} 指令是
\rm \varepsilon , K \to \varepsilon , 栈顶读取到
\rm K 字符删除 ;
④ 拆分指令 : 在循环状态
\rm q_{loop} 中的基本指令中存在多字符指令 , 如
\rm \varepsilon , S \to aTb ,
\rm S 读取到空字符
\varepsilon , 使用
\rm aTb 字符替换栈顶的
\rm S 字符 , 这是
3 个字符 , 肯定不行 , 需要逐个放进去 , 先放
\rm b , 再放
\rm T , 最后放
\rm a ;
\rm \varepsilon , S \to aTb 最终分解为 :
\rm \varepsilon , S \to b 读取
\rm S 字符放入
\rm b 到栈顶替换
\rm S 字符 ,
\rm \varepsilon , \varepsilon \to T 读取空字符放入
\rm T 到栈顶 ,
\rm \varepsilon , \varepsilon \to a 读取空字符放入
\rm a 到栈顶 ;
\rm \varepsilon , T \to Ta 最终分解为 :
\rm \varepsilon , T \to a , 读取
\rm T 字符放入
\rm a 到栈顶替换
\rm T 字符 ,
\rm \varepsilon , \varepsilon \to T , 读取空字符放入
\rm T 到栈顶 ;
最终的下推自动机样式