【计算理论】计算理论总结 ( 上下文无关文法 CFG 转为下推自动机 PDA 示例 1 ) ★★

简介: 【计算理论】计算理论总结 ( 上下文无关文法 CFG 转为下推自动机 PDA 示例 1 ) ★★

文章目录

一、上下文无关文法 CFG 转为下推自动机 PDA 流程

二、上下文无关文法 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}q

start


 , 跳转到 q l o o p \rm q_{loop}q

loop


 状态的指令 ε , ε → K \rm \varepsilon , \varepsilon \to Kε,ε→K , 使用 K \rm KK 替换栈内空字符 ε \varepsilonε , 即将 K \rm KK 放入栈中 ;


② 循环状态 : q l o o p \rm q_{loop}q

loop


 状态的指令都是从本状态指向本状态 , 生成两种指令 , 一种是基本指令 , 一种是终端字符指令 ;


基本指令 S → a T b ∣ b \rm S \to aTb|bS→aTb∣b 生成为 ε , S → a T b \rm \varepsilon , S \to aTbε,S→aTb 和 ε , S → b \rm \varepsilon , S \to bε,S→b 两条指令 , 前面都是读取空字符作为栈读取的信息 ;


终端字符指令 , 如果存在终端字符 a \rm aa 和 b \rm bb , 那么生成 a , a → ε \rm a, a \to \varepsilona,a→ε 和 b , b → ε \rm b, b \to \varepsilonb,b→ε 两条指令 , 含义是读取栈顶 a \rm aa 字符 , 将该字符使用空字符替代 , 即从栈中删除该字符 ;



③ 接受状态 : q l o o p \rm q_{loop}q

loop


 状态跳转到 q a c c e p t \rm q_{accept}q

accept


 指令是 ε , K → ε \rm \varepsilon , K \to \varepsilonε,K→ε , 栈顶读取到 K \rm KK 字符删除 ;


④ 拆分指令 : 在循环状态 q l o o p \rm q_{loop}q

loop


 中的基本指令中存在多字符指令 , 如 ε , S → a T b \rm \varepsilon , S \to aTbε,S→aTb , S \rm SS 读取到空字符 ε \varepsilonε , 使用 a T b \rm aTbaTb 字符替换栈顶的 S \rm SS 字符 , 这是 3 33 个字符 , 肯定不行 , 需要逐个放进去 , 先放 b \rm bb , 再放 T \rm TT , 最后放 a \rm aa ;


最终分解为

ε , S → b \rm \varepsilon , S \to bε,S→b 读取空字符放入 b \rm bb 到栈顶 ,

ε , ε → T \rm \varepsilon , \varepsilon \to Tε,ε→T 读取空字符放入 T \rm TT 到栈顶 ,

ε , ε → a \rm \varepsilon , \varepsilon \to aε,ε→a 读取空字符放入 a \rm aa 到栈顶 ;






二、上下文无关文法 CFG 转为下推自动机 PDA 示例 1


将上下文无关语法 ( CFG ) 转为下推自动机 ( PDA ) :


S → a T b ∣ b \rm S \to aTb | bS→aTb∣b

T → T a ∣ ε \rm T \to Ta|\varepsilonT→Ta∣ε



上下文无关文法 CFG 转为下推自动机 PDA 流程 :


① 开始状态 : 开始状态 q s t a r t \rm q_{start}q

start

image.png

 , 跳转到 q l o o p \rm q_{loop}q

loop


 状态的指令 ε , ε → K \rm \varepsilon , \varepsilon \to Kε,ε→K , 使用 K \rm KK 替换栈内空字符 ε \varepsilonε , 即将 K \rm KK 放入栈中 ;




② 循环状态 : q l o o p \rm q_{loop}q

loop


 状态的指令都是从本状态指向本状态 , 生成两种指令 , 一种是基本指令 , 一种是终端字符指令 ;


基本指令 S → a T b ∣ b \rm S \to aTb|bS→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|\varepsilonT→Ta∣ε 生成为 ε , T → T a \rm \varepsilon , T \to Taε,T→Ta 和 ε , T → ε \rm \varepsilon , T \to \varepsilonε,T→ε 两条指令 , 前面都是读取空字符作为栈读取的信息 ;


终端字符指令 , 如果存在终端字符 a \rm aa 和 b \rm bb , 那么生成 a , a → ε \rm a, a \to \varepsilona,a→ε 和 b , b → ε \rm b, b \to \varepsilonb,b→ε 两条指令 , 含义是读取栈顶 a \rm aa 字符 , 将该字符使用空字符替代 , 即从栈中删除该字符 ;

image.png




③ 接受状态 : q l o o p \rm q_{loop}q

loop


 状态跳转到 q a c c e p t \rm q_{accept}q

accept


 指令是 ε , K → ε \rm \varepsilon , K \to \varepsilonε,K→ε , 栈顶读取到 K \rm KK 字符删除 ;

image.png



④ 拆分指令 : 在循环状态 q l o o p \rm q_{loop}q

loop


 中的基本指令中存在多字符指令 , 如 ε , S → a T b \rm \varepsilon , S \to aTbε,S→aTb , S \rm SS 读取到空字符 ε \varepsilonε , 使用 a T b \rm aTbaTb 字符替换栈顶的 S \rm SS 字符 , 这是 3 33 个字符 , 肯定不行 , 需要逐个放进去 , 先放 b \rm bb , 再放 T \rm TT , 最后放 a \rm aa ;


ε , S → a T b \rm \varepsilon , S \to aTbε,S→aTb 最终分解为 :

ε , S → b \rm \varepsilon , S \to bε,S→b 读取 S \rm SS 字符放入 b \rm bb 到栈顶替换 S \rm SS 字符 ,

ε , ε → T \rm \varepsilon , \varepsilon \to Tε,ε→T 读取空字符放入 T \rm TT 到栈顶 ,

ε , ε → a \rm \varepsilon , \varepsilon \to aε,ε→a 读取空字符放入 a \rm aa 到栈顶 ;


ε , T → T a \rm \varepsilon , T \to Taε,T→Ta 最终分解为 :

ε , T → a \rm \varepsilon , T \to aε,T→a , 读取 T \rm TT 字符放入 a \rm aa 到栈顶替换 T \rm TT 字符 ,

ε , ε → T \rm \varepsilon , \varepsilon \to Tε,ε→T , 读取空字符放入 T \rm TT 到栈顶 ;




最终的下推自动机样式

image.png


目录
相关文章
|
SQL 分布式计算 大数据
【大数据技术Spark】DStream编程操作讲解实战(图文解释 附源码)
【大数据技术Spark】DStream编程操作讲解实战(图文解释 附源码)
355 0
|
Python
一条龙操作有效解决PermissionError: [WinError 5] 拒绝访问的问题
一条龙操作有效解决PermissionError: [WinError 5] 拒绝访问的问题
2060 0
|
安全 关系型数据库 MySQL
轻松入门MySQL:MySQL8权限管理详解,角色和用户操作实例(18)
轻松入门MySQL:MySQL8权限管理详解,角色和用户操作实例(18)
1646 0
|
SQL 存储 关系型数据库
什么是关系型数据库?有什么优缺点
什么是关系型数据库?有什么优缺点
|
Linux Windows
FinalShell连接Linux虚拟机报错java.net.ConnectException: Connection timed out: connect(亲测有效)
FinalShell连接Linux虚拟机报错java.net.ConnectException: Connection timed out: connect(亲测有效)
3830 0
|
存储 人工智能 API
阿里云百炼应用实践系列-10分钟在企业微信中集成一个 AI 助手
在阿里云平台上,您只需十分钟,无需任何编码,即可在企业微信上为您的组织集成一个具备大模型能力的AI助手。此助手可24小时响应用户咨询,解答各类问题,尤其擅长处理私域问题,从而成为您企业的专属助手,有效提升用户体验及业务竞争力。
1330 4
|
Prometheus 监控 数据可视化
Grafana 插件生态系统:扩展你的监控能力
【8月更文第29天】Grafana 是一个流行的开源平台,用于创建和共享统计数据的仪表板和可视化。除了内置的支持,Grafana 还有一个强大的插件生态系统,允许用户通过安装插件来扩展其功能。本文将介绍一些 Grafana 社区提供的插件,并探讨它们如何增强仪表盘的功能性。
944 3
|
SQL 安全 关系型数据库
SQL错误代码1303解析与解决方案:深入理解并应对权限问题
在数据库管理和开发过程中,遇到错误代码是常见的事情,每个错误代码都代表着一种特定的问题
|
Java 测试技术 持续交付
Java一分钟之-Spring Cloud Contract:契约测试
【6月更文挑战第16天】Spring Cloud Contract是微服务契约测试框架,通过DSL定义接口行为,使用WireMock生成存根进行独立开发验证。常见问题包括契约编写不清晰、未集成到CI/CD和契约版本控制混乱。例如,定义一个`GET /greeting`返回JSON响应的契约,Spring Cloud Contract会自动生成测试代码,帮助确保服务间接口一致性,提升开发效率和系统稳定性。
375 7
|
机器学习/深度学习 PyTorch 算法框架/工具
【从零开始学习深度学习】27.卷积神经网络之VGG11模型介绍及其Pytorch实现【含完整代码】
【从零开始学习深度学习】27.卷积神经网络之VGG11模型介绍及其Pytorch实现【含完整代码】