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

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

II . 上下文无关语法 ( CFG ) 等价于 下推自动机 ( PDA )


假设某语言由 上下文无关语法 ( CFG ) 生成 , 找到一个 下推自动机 ( PDA ) 识别该语言 ;



构造下推自动机流程 ( PDA ) :



构造下推自动机 , 包含 3 33 个状态 , 开始状态 q s t a r t q_{start}q

start


 , Loop 循环状态 q l o o p q_{loop}q

loop


 , 可接受状态 q a c c e p t q_{accept}q

accept


 ;



1 . q s t a r t q_{start}q

start


 开始状态 :


image.png


读取 ε \varepsilonε 字符 , 使用 T S TSTS 替换栈顶的 ε \varepsilonε , 对应的指令为



ε , ε → T S \varepsilon , \varepsilon \to TS

ε,ε→TS


其中的 S SS 是栈顶的标识 , T TT 是栈内的实际字符 ;

image.png




2 . q l o o p q_{loop}q

loop


 循环阶段 , 根据 上下文无关语法 ( CFG ) 做替换 ;



① 当栈顶是变元时 , 作变换 , 读取 ε \varepsilonε , 即什么都不读取 , 将栈顶的变元 替换成 w ww , 生成的 下推自动机 指令为 " ε , A → w \varepsilon , A \to wε,A→w " , 对应着的上下文无关语法规则为 A → w A \to wA→w ;


② 当栈顶是终端字符 ( 常元 ) , 让带子上的 读头 读取一个终端字符 , 对应的栈中 , 将栈顶的终端字符删除 , 相当于使用 ε \varepsilonε 替换终端字符 , 生成指令 " a , a → ε a , a \to \varepsilona,a→ε " ;



一直读取 终端字符 , 并将栈顶的终端字符删除 , 一直循环该操作 , 直到 栈顶是一个变元 未为止 ;


image.png



3 . 跳转到 q a c c e p t q_{accept}q

accept


 状态 : 当栈内的字符都出栈后 , 只剩下一个 S SS 字符作为栈底标识 , 此时 S SS 出栈 , 生成对应的 下推自动机指令 " ε , S → ε \varepsilon , S \to \varepsilonε,S→ε " , 即使用空字符 ε \varepsilonε 替换栈内的 S SS 字符 ;


之后跳转到最后一个状态 , q a c c e p t q_{accept}q

accept


 可接受状态 ;

image.png


目录
相关文章
|
消息中间件 缓存 NoSQL
Redis经典问题:缓存雪崩
本文介绍了Redis缓存雪崩问题及其解决方案。缓存雪崩是指大量缓存同一时间失效,导致请求涌入数据库,可能造成系统崩溃。解决方法包括:1) 使用Redis主从复制和哨兵机制提高高可用性;2) 结合本地ehcache缓存和Hystrix限流降级策略;3) 设置随机过期时间避免同一时刻大量缓存失效;4) 使用缓存标记策略,在标记失效时更新数据缓存;5) 实施多级缓存策略,如一级缓存失效时由二级缓存更新;6) 通过第三方插件如RocketMQ自动更新缓存。这些策略有助于保障系统的稳定运行。
1051 1
|
SQL 前端开发 数据可视化
MySQL Workbench 使用教程 - 如何使用 Workbench 操作 MySQL / MariaDB 数据库中文指南
MySQL Workbench 是一款专门为 MySQL 设计的可视化数据库管理软件,我们可以在自己的计算机上,使用图形化界面远程管理 MySQL 数据库。有关 MySQL 远程管理软件,你可以选择 Windows 下的 HeidiSQL,MacOS 下的 Sequel Ace 或者 MySQL 官方推出的跨平台客户端 MySQL Workbench 。
11901 0
|
Java 程序员
java基础(5)标识符命名规则和命名规范
Java标识符命名规则包括只能使用数字、字母、下划线\_、$,且数字不能开头,不能使用关键字命名,且严格区分大小写。命名规范建议类名、接口名首字母大写,变量名、方法名首字母小写,常量名全大写。
440 2
|
7月前
鸿蒙开发:自定义一个Toast
如果整个项目的toast样式都一样,直接在初始化中设置统一的属性即可,针对单独不一样的效果,可以单独设置。
146 2
鸿蒙开发:自定义一个Toast
|
12月前
|
存储 算法
Leetcode第三题(无重复字符的最长子串)
这篇文章介绍了解决LeetCode第三题“无重复字符的最长子串”的算法,使用滑动窗口技术来找出给定字符串中最长的不含重复字符的子串,并提供了详细的代码实现和解释。
559 0
Leetcode第三题(无重复字符的最长子串)
|
11月前
|
存储 算法 搜索推荐
Python高手必备!揭秘图(Graph)的N种风骚表示法,让你的代码瞬间高大上
在Python中,图作为重要的数据结构,广泛应用于社交网络分析、路径查找等领域。本文介绍四种图的表示方法:邻接矩阵、邻接表、边列表和邻接集。每种方法都有其特点和适用场景,掌握它们能提升代码效率和可读性,让你在项目中脱颖而出。
284 5
|
10月前
|
机器学习/深度学习 存储 自然语言处理
如何提升大模型的“深度思维能力”
本文探讨了如何通过模拟人类的思维过程来提升大模型的推理和规划能力。文章从人类的思维模式入手,分析了人类在面对复杂问题时的“增-减”信息循环,提出了通过增加相关信息和减少噪声来降低信息熵的方法。文章还讨论了如何生成逻辑自洽的推理路径,并通过实例说明了多结论问题的处理方法。最后,文章指出,通过现有的大模型进行针对性微调,可以逐步强化数据,提升模型的推理和规划能力。
717 11
|
10月前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
326 7
|
机器学习/深度学习 人工智能 自然语言处理
文生图、文生视频等AIGC功能将突破性增长
【1月更文挑战第11天】文生图、文生视频等AIGC功能将突破性增长
424 3
文生图、文生视频等AIGC功能将突破性增长
|
监控 JavaScript 前端开发
深入理解与实践:利用监听事件优化应用程序响应性
【7月更文挑战第3天】事件监听是软件开发中的关键,基于“发布-订阅”模式,用于响应用户操作、系统变化等。常见于UI交互、异步编程、系统事件和游戏开发。JavaScript示例展示了如何监听按钮点击:添加事件监听器到元素,定义处理函数。进阶技巧包括事件委托、冒泡与捕获、节流和防抖,用于优化性能和用户体验。理解并运用事件监听能提升应用质量。
474 2