编译原理Compiler_3

2023.3.15

  1. 自动机DFA
    1. 定义:
      • 字母表 Σ (ϵ /∈ Σ)
      • 有穷的状态集合 S
      • 唯一的初始状态 s0 ∈ S
      • 状态转移函数 δ  δ : S × Σ → S
      • 接受状态集合 F ⊆ S
      • 约定:所有没有对应出边的字符默认指向一个“死状态”
    2. NFA易于理解,便于描述语言,DFA易于判断,适合产生词法分析器
      • RE --》NFA --》DFA --》词法分析器
    3. Thompson构造法:按结构归纳
      • 定义:
      • 性质:复杂度分析
        1. N(r) 的开始状态与接受状态均唯一。
        2. 开始状态没有入边, 接受状态没有出边。
        3. N(r) 的状态数 |S| ≤ 2 × |r|。 (|r| : r 中运算符与运算分量的总和) 每一步加一个初始状态和一个结束状态。下一步将上一步加的两个状态都改为普通过程状态
        4. 每个状态最多有两个 ϵ-入边与两个 ϵ-出边。
        5. ∀a ∈ Σ, 每个状态最多有一个 a-入边与一个 a-出边。
      • 例子:考试要考  大题中的第一问
    4. 子集构造法:
      • Michael O. Rabin (1931 ∼) Dana Scott (1932 ∼)
      • 原理:思想: 用 DFA 模拟 NFA
      • 例子:看初始状态会在字母表的驱动下跑到哪个状态下,然后动态扩展,直到无法扩展为止,这样就得到DFA的所有状态和状态转移关系
      • 过程:A:{0,1,2,4,7} 看在a和b的驱动下会跑到那个状态上 Aa->B:{3,8,6,7,1,2,4}        Ab->C{5,6,7,1,2,4}

E状态包括了接受状态,所以E也是接受状态

      • 总结算法:
        1. 给定s,求ϵ闭包
          1. 从状态 s 开始, 只通过 ϵ-转移可达的状态集合 ϵ-closure(s) = {t ∈ SN |s ϵ ∗ −→ t}
        2. 状态子集找ϵ闭包
          1. ϵ-closure(T) = ∪ s∈T ϵ-closure(s)
        3. 状态转移,T集中每个状态在a的驱动下转移到哪个状态:
          1. move(T, a) = ∪ s∈T δ(s, a)
      • 复杂度分析:2n
    • 原理符号化:

子集构造法 (N =⇒ D) 的原理:

N : (ΣN , SN , n0, δN , FN )

D : (ΣD, SD, d0, δD, FD)

ΣD = ΣN

SD ⊆ 2 SN (∀sD ∈ SD : sD ⊆ SN )

初始状态 d0 = ϵ-closure(n0)

转移函数 ∀a ∈ ΣD : δD(sD, a) = ϵ-closure(move(sD, a))

接受状态集 FD = {sD ∈ SD | ∃f ∈ FN . f ∈ sD}

    1. 闭包和不动点      T =⇒ f(T) =⇒ f(f(T)) =⇒ f(f(f(T))) =⇒ . . . 直到找到 x 使得 f(x) = x (x 称为 f 的不动点)
    2. DFA最小化算法John Hopcroft (1939 ∼):等价的状态可以合并
      • 定义:
      • 划分而非合并:有一个初始的划分,若一个组中有两个不同元素,在相同字符的驱动下,转移到两个不同状态组了,则两个元素不属于同一个组。
        接受状态和非接受状态必定不等价
      • 例子:
      • 和初始状态合并的状态都是初始状态,接受状态同理
      • 合并没有一个很好的开始,于是选择用分裂的方式倒推相同类
      • 需要补齐死状态,其他状态通过各种字符转移到死状态都得补齐,然后才能使用DFA最小化算法
      • DFA最小化是唯一的
    3. 词法分析器:
      • 最前优先匹配:关键字
      • 最长优先匹配:匹配尽可能长的字符串
      • 正则->NFA->DFA
        1. 需要在每一个接收状态上写清楚接受的字符串的类型,并采用最前优先匹配
        2. 转换成DFA时可能会有死状态,需要丢弃,避免词法分析器徒劳消耗输入流
        3. 模拟运行该 DFA, 直到无法继续为止 (输入结束或状态无转移); 若 s 为接受状态, 则识别成功; 否则, 回溯 (包括状态与输入流) 至最近一次经过的接受状态, 识别成功; 若没有经过任何接受状态, 则报错 (忽略第一个字符)。
        4. 无论成功还是失败, 都从初始状态开始继续识别下一个词法单元
        5. 特定于词法分析器的 DFA 最小化方法,初始划分需要考虑不同的词法单元,识别的词法单元不同,不属于同一类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值