编译原理三:词法分析详解

982 阅读5分钟

词法分析是编译的第一个阶段,在单词的级别上 分析和翻译源程序。其涉及的理论只是包括:有限自动机理论;有限自动机理论与正则文法、正则式之间在描述语言方面有一一对应的关系。 引为本篇是以学习基本概念为主,所以后面大部分都是引用的编译原理教学课件内容(不要介意啊学习为主),以后会逐步学习进行实战,也会整理出文章哦

正则表达式、正规文法、有限自动机

正规文法、正规集与正规式

正规文法:是3型文法,这个在上篇编译器基础中有提到。正则文法是描述正规集的文法,可用于描述程序涉及语言的语法部分。例如:标识符这种单词可以用 下面的规则描述。

<标识符> -> <字母>|<标识符>(<字母>|<数字>)。其中<字母>表示任意英文字母,<数字>表示任意数字)

正规集:由正规文法产生的语言。正规集是集合,可有穷也可无穷。可通过正规式 来形式化表示。

正规式:设A是非空的有限字母表,A=aii=1,2,......nA={ai| i=1,2,......n},则

  • ε,Φ(空集)和ai (i=1,2,......n)都是正规式
  • 若α、β是正规式,则αβαβαβ+α|β、 α•β 、α*、 β+也是正规式。其中,“|”读作为“或”,也可写作为“+”或“,”;“•”读作连接
  • 正规式只能通过有限次使用1,2规则获得
  • 仅由字母表A=aii=1,2,......nA={ai| i=1,2,......n}上的正规式α所组成的语言称作正规集,记作L(α)
  • 利用正规集相同,可用来证明相应正规式等价

例如:证明b(ab)*=(ba)*b

    ∵L(b(ab)*)={b,bab,babab,......}
    L((ba)*b)={b,bab,babab,......}
    又∵正规集的前n项相同
    ∴可知它们的正规集是相等的 
    故:正规式 b(ab)*=(ba)*b

三者之间的关系

  • 一个正规语言可以用正规文法定义,也可以用正 规式定义,对任意一个正规文法,存在一个定义 同一个语言的正规式;同样,对每个正规式,存 在一个生成同一语言的正规文法;有些正规语言 很容易用文法定义,有些则用正规式定义更容易; 两者之间是可以转换的,结构上具有等价性。
  • 由正规文法或正规式定义的正规语言的集合构成正规集

例如 正规式:L(b(ab))L(b(ab)*) 的正规集为 b,bab,babab,......{b,bab,babab,......}

正则表达式

正则表达式(Regular Expression,RE ) 是一种用来描述正则语言的 更紧凑的表示方法

:r=a(ab)(ε(.)(ab)(ab))例:r = a(a|b)*( ε | (.| _)(a|b)(a|b)* )

正则表达式可以由较小的正则表达式按照特定规则递归地构建。每个正则表达式 r定义(表示)一个语言,记为L(r )。 这个语言也是根据r 的子表达式所表示的语言递归定义的

  • ε是一个RE,L(ε) = {ε}
  • 如果 a∈∑,则a是一个RE,L(a) = {a}
  • 假设 r和 s都是 RE,表示的语言分别是 L(r)和L(s),则
    • r|s 是一个RE,L( r|s ) = L(r)∪L(s)
    • rs 是一个RE,L( rs ) = L(r) L(s)
    • r* 是一个RE,L( r* )= (L(r))*
    • (r) 是一个RE,L( (r) ) = L(r) 例:令 ∑ = {a, b},则
  • L(ab)=L(a)L(b)=ab=a,b L(a|b) = L(a)∪L(b) ={a}∪{b} = {a, b}
  • L((ab)(ab))=L(ab)L(ab)=a,ba,b=aa,ab,ba,bb L((a|b)(a|b)) = L(a|b) L(a|b)={a, b}{a, b}= { aa, ab, ba, bb }
  • L(a)=(L(a))=a=ε,a,aa,aaa,...L(a*) = (L(a))*= {a}*= { ε, a, aa, aaa, . . . }
  • L((ab))=(L(ab))=a,b=ε,a,b,aa,ab,ba,bb,aaa,...L((a|b)*) = (L(a|b))* = {a, b}*= { ε, a, b, aa, ab, ba, bb, aaa, . . .}
  • L(aab)=a,b,ab,aab,aaab,... L(a|a*b) = { a, b, ab, aab, aaab, . . .}

例:C语言无符号整数的RE

  • 十进制整数的RE:(1...9)(0...9)0(1|...|9)(0|...|9)*|0
  • 八进制整数的RE:0(01234567)(01234567)0(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*
  • 十六进制整数的RE:0x(01...9a...fA...F)(0...9a...fA...F)0x(0|1|...|9|a|...| f |A|...|F)(0|...|9|a|...| f |A|...|F )*

正则语言

可以用RE定义的语言叫做正则语言(regular language)或正则集合(regular set)

RE的代数定律

截屏2021-03-22 下午1.41.21.png

正则文法与正则表达式等价

  • 对任何正则文法 G,存在定义同一语言的 正则表达式 r
  • 对任何正则表达式 r,存在生成同一语言的 正则文法 G

正则定义

正则定义是具有如下形式的定义序列: d1r1d2r2d3r3....dnrnd1→r1 d2→r2 d3→r3 .... dn→rn(给一些RE命名,并在之后 的RE中像使用字母表中的 符号一样使用这些名字) 其中:每个di都是一个新符号,它们都不在字母表 Σ中, 而且各不相同;每个ri是字母表 Σ∪{d1 ,d2 , ... ,di-1}上的正则表达式

例 C语言中标识符的正则定义

  1. digit012...9digit → 0|1|2|...|9
  2. letter_ → A|B|...|Z|a|b|...|z|_
  3. idletter(letterdigit)id → letter_(letter_|digit)* 截屏2021-03-22 下午8.17.55.png

有穷自动机

  • 有穷自动机( Finite Automata,FA )是对一类处理系统 建立的数学模型
  • 这类系统具有一系列离散的输入输出信息有穷数目的内部状态(状态:概括了对过去输入信息处理的状况)
  • 系统只需要根据当前所处的状态和当前面临的输入信息 就可以决定系统的后继行为。每当系统处理了当前的输入后,系统的内部状态也将发生改变

FA的典型例子 电梯控制装置

  • 输入:顾客的乘梯需求(所要到达的层号)
  • 状态:电梯所处的层数+运动方向
  • 电梯控制装置并不需要记住先前全部的服务要求,只需要知道电梯当前所处的状态以及还没有满足的所有服务请求

FA模型

截屏2021-03-23 上午9.44.23.png

  • 输入带(input tape):用来存放输入符号串
  • 读头(head ):从左向右逐个读取输入符号,不能修改(只读)、不能往返移动
  • 有穷控制器( finite control ):具有有穷个状态数,根据当前的状态和当前输入符号控制转入下一状态

FA的表示

截屏2021-03-23 上午9.48.24.png

FA 定 义(接 收)的 语 言

截屏2021-03-23 上午9.49.12.png

最长子串匹配原则

截屏2021-03-23 上午9.51.15.png

有穷自动机的分类

  • 确定的FA (Deterministic finite automata, DFA)
  • 非确定的FA (Nondeterministic finite automata, NFA)

确定的有穷自动机 (DFA)

截屏2021-03-23 上午10.05.56.png 截屏2021-03-23 上午10.06.28.png

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

截屏2021-03-23 上午10.06.42.png 截屏2021-03-23 上午10.06.50.png

DFA和NFA的等价性

  • 对任何非确定的有穷自动机N ,存在定义同一语言的确定的有穷自动机D
  • 对任何确定的有穷自动机D ,存在定义同一语言的 非确定的有穷自动机N 截屏2021-03-23 上午10.08.54.png

DFA的算法实现

截屏2021-03-23 上午10.09.39.png

从正则表达式到有穷自动机

截屏2021-03-23 上午10.14.50.png

从NFA到DFA的转换

截屏2021-03-23 上午10.18.23.png 计算 ε-closure(T)

将T的所有状态压入stack中; 将ε-closure(T )初始化为 T ;
while(stack非空){
    将栈顶元素 t 给弹出栈中;
    for(每个满足如下条件的u :从t出发有一个标号为ε的转换到达状态u) 
        if ( u不在ε-closure(T )中){
            将u加入到ε-closure(T )中;
            将u压入栈中;
         }
}

识别单词的DFA

截屏2021-03-23 上午10.21.54.png

词法分析阶段的错误处理

截屏2021-03-23 上午10.24.21.png