编译原理课程学习-词法分析

编译原理课程学习-词法分析

概念整理

相关资料来源:慕课哈工大编译原理课程

编译原理课程学习-词法分析

正则表达式

  • 定义:用于描述正则语言更紧凑的表示方法,用符号为r表示
  • 每个正则表达式 r定义(表示) 一个语言,记为L(r )。
  • 运算:*、 连接、 | (优先级从高到低)

编译原理课程学习-词法分析

正则定义

  • 就是给一个正则表达式RE取一个别名,就可以像字母表内的元素一样来使用

有穷自动机(FA)

  • 定义:根据目前所处的状态和输入信息来决定后继行为的数学模型(类似电梯)

  • 用M表示有穷自动机,某个串可以从初始状态到达最终状态则说该串被FA接收

  • 由一个有穷自动机M接收的所有串构成的集合称为是
    该FA定义(或接收)的语言,记为L(M )

  • 表示:转换图和转换表

    • 转换图:初始状态(start箭头指向)、终止状态(双圈)、带有标记的有向边、其他结点

      编译原理课程学习-词法分析

    • 转换表:一个二维表,填写对应输入下的下一结点

  • 分类:确定的有穷自动机(DFA)

    ​ 非确定的有穷自动机(NFA)

DFA

  • 形式化定义M = ( S, Σ , δ,s0, F )
    S: 有穷状态集(就是结点)
    Σ: 输入字母表,即输入符号集合。 假设ε不是 Σ中的元素
    δ: 将S× Σ映射到S的转换函数。转换到的新状态唯一
    s0: 开始状态 (或初始状态), s0∈ S
    F: 接收状态(或终止状态) 集合, F⊆ S

    编译原理课程学习-词法分析

NFA

  • 形式化定义M = ( S, Σ , δ, s0, F )
    S:有穷状态集
    Σ: 输入符号集合,即输入字母表。假设ε 不是Σ中的元素
    δ: 将S× Σ映射到2S的转换函数。转换的新状态不唯一,用一个集合来表示
    s0:开始状态 (或初始状态), s0∈ S
    F:接收状态(或终止状态)集合, F⊆ S

    编译原理课程学习-词法分析

带有“ε-边”的NFA

  • 形式化定义M = ( S, Σ , δ, s0, F )
    S:有穷状态集
    Σ: 输入符号集合,即输入字母表。假设ε不是Σ中的元素
    δ: 将S× (Σ∪ {ε})映射到2S的转换函数。区别在于转换的条件可以是ε
    s0:开始状态 (或初始状态), s0∈ S
    F:接收状态(或终止状态)集合, F⊆ S

ps:DNA和NFA是等价的,都能互相转换

​ 带有和不带有“ε-边”的NFA 也是等价的

概念区别总结

  • 正则文法:3型文法,描述正则语言的规则 (推导式)
  • 正则表达式:描述正则语言的简易形式 (*、 连接、 | 和元素连接的形式)
  • FA:根据当前情况决定后继的数学模型 (转换图、转换表)

三者都是可以互相转换的

正则表达式到有穷自动机

NFA是比较直观也容易转化的,而DFA看起来比较复杂,但是对于计算机而言,确定的自动机处理起来才是比较舒服的。因此,从正则表达式到DFA,我们可以先从正则表达式到NFA,再从NFA到DFA

从正则表达式到NFA

转换原理

编译原理课程学习-词法分析

从NFA到DFA

若转换后的节点有多种情况,则可以将这个集合作为一个新的节点,再判断这个集合内的元素是否有可以转换的新结点

带有ε 边的NFA,在转换的过程中记住,ε 边可以不用转换直接到达下一个结点。

具体的过程可以看哈工大编译原理课程

视频介绍的方式还是比较直观的,其方法适合直接观察直接的转换。

如果需要真正的解题过程需要列出转换表,重新构造转换图。可以参考博文NFA到DFA

总结

词法分析部分的概念还是比较多的,重点在于理解每一个概念的基本定义,通过他们的联系串联起来就可以很好地记住。

词法分析的目的在于将字符流转换单词流,从而作为语法分析的输入,这一章的内容其实就是在说这一个步骤。