《Engineering a Complier》学习笔记(二)
Scanner扫描器(又称 词法分析器)
Scanner扫描器,又称词法分析器,将离散的字符转换为word stream。
1. 状态图和FA
利用状态转换图对符号串进行识别的方法是一个自顶向下的分析算法。
用状态图表示的字符和数字分析:
有限自动机(FA),是一个5维的元组( S, Σ, δ, S0, SA),用来存储状态机之间状态的转换。
- S:表示所有状态的集合,包括Se代表错误状态
- Σ:表示识别字符的集合
- δ( s, c) :表示不同状态转移方程的集合
- S0:自动机的初始态
- SA:代表可接受的状态的集合,在状态图中用双圆表示。满足:SA∈S
在识别字符串中的示例:
在识别数字时,以无符号数为例,由于数字以0开头只有一个数字0,所以可以将0~9的状态设置为自循环状态,如下图:
有限自动机:
一个确定的有限自动机(DFA)实际上是相应的状态转换图的一种形式描述,或者说,是状态转移矩阵的另一种表示。
2. 正则表达式法描述
正则表达式法(RE)和有限状态机(FA)在描述同一语言类的意义下是相互等价的,可以相互转换:
n(ew|ot)
等价于
正则表达式法的3种基本操作:
1. Alternation:
R | S <=> { x | x ∈ R or x ∈ S}
2. Concatenation:
RS <=> { xy | x ∈ R and y ∈ S}
3. Closure:表示和自己的 Concatenation
R3 <=> ( R | RR | RRR)
“1. If a ∈ Σ, then a is also an re denoting the set containing only a.
2. If r and s are res, denoting sets L( r) and L( s), respectively, then r | s is an re denoting the union, or alternation, of L( r) and L( s),
rs is an re denoting the concatenation of L( r) and L( s), respectively, and
r* is an re denoting the Kleene closure of L( r).
3. ϵ is an re denoting the set containing only the empty string.”
摘录来自: Keith D. Cooper. “Engineering a Compiler。”
示例,用RE识别C++和JAVA中的注释:
/* (^ * | *+ ^ /)* */
3. DFA和NFA
参考:https://www.cnblogs.com/AndyEvans/p/10240790.html
- NFA: Nondeterministic Finite Automata, 不确定的有穷自动机:状态的转换在确定的输入下得到的结果是不确定的,示例:
- DFA: Deterministic finite automaton , 确定的有穷自动机:状态的转换在确定的输入下得到的结果是一定的,示例:
DFA和NFA可以等效转换
上图中,r = (a|b)*abb
ϵ-Transition, 指右部为一空字符串ϵ的产生式。可以连接两个不同自动机之间的状态:
<=>
含有ϵ产生式的自动机和无ϵ的自动机之间也是可以相互转换的。
4. 正则表达式到有穷自动机
Scanner code,RE,DFA,NFA之间的关系:
4.1 从RE到NFA
参考:https://blog.csdn.net/qq_40294512/article/details/89003655
Thompson's Construction:
将RE转换成带ϵ的自动机
4.2 从NFA到DFA
子集法
参考:https://blog.csdn.net/qq_40294512/article/details/89004777
ϵ-closure定义:
若I是NFA M的状态集合的一个子集,定义 ϵ-closure(I) 如下:
- 状态集I的ϵ-closure(I)是一个状态集
- 状态集I的所有状态属于ϵ-closure(I)
- 若S∈I,从S出发的经过任意条ϵ弧到达的状态都属于ϵ-closure(I)
如下为转换逻辑:
4.3 简化DFA
Hopcroft算法
- 将得到的状态进行划分 ∏ ,划分为两部分,一部分为接收态,一部分为为非接收态组。
- 继续进行划分,通过其可以匹配的字符进行判断,若该组内所有成员匹配字符都落在同一组内,即不可再分,否则重新划分组
- 若 ∏new = ∏ ,则进入步骤4,否则返回2
- 在分组 ∏new 每个组中选取一个状态作为代表,代表DFA的最简状态。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具