其他分享
首页 > 其他分享> > 编译原理教程_3 词法分析

编译原理教程_3 词法分析

作者:互联网

文章原稿
https://gitee.com/fakerlove/fundamentals-of-compiling

文章目录

3. 词法分析

3.1 设计——状态转换图

3.1.1 词法分析概述

3.1.2 词法分析器的设计

词法分析程序自动生成有哪些困难?

1) 词法分析器的结构

在这里插入图片描述

2) 超前搜索

3) 状态转换图

4) 状态转换图的实现

在这里插入图片描述

不含回路的分叉结点
含回路的分叉结点
终态结点

3.2 正规集和正规式

3.2.1概念

设A是非空的有限字母表,A={ai| i=1,2,……n},正规式和正规集的递归定义,对给定的字母表Σ:

3.2.2 正规式性质

对正规式,下列等价成立:

若α、β、γ是字母表A上的正规式,且ε∉L(γ),则

α= β| α γ 当且仅当 α= β γ*

α= β| γ α当且仅当 α= γ* β

在这里插入图片描述

3.2.3 正规文法-> 正规式⭐️

文法产生式正规式
A → x B , B → y A \to xB,B\to y A→xB,B→yA=xy
A → x A ∣ y A \to xA\mid y A→xA∣y A = x ∗ y A=x^*y A=x∗y
A → x , A → y A\to x ,A \to y A→x,A→y A = x ∣ y A=x\mid y A=x∣y

例题

已知正规文法G1的产生式,求出它

所定义的正规式。

产生式为:S → aS | aB

B → bB|bA

A → cA | c

解:

1.由产生式写出对应的联立方程组

S = aS | aB ……(1)

B = bB|bA ……(2)

A = cA | c ……(3)

2.根据定理2,

由(1) S = aS | aB得: S=a*aB=a+B ……(4)

同理,由(2) B = bB|bA得: B=b+A ……(5)

同理,由(3) A = cA | c得: A=c*c=c+ ……(6)

将(6)代入(5)得:B=b+c+ ……(7)

将(7)代入(4)得:S=a+b+c+ ……(8)

3.故:正规式为S=a+b+c+

3.2.4 正规式-> 正规文法⭐️

需要借助有限自动机

3.3 有限自动机(FA)

  • 有限自动机是一种识别装置,它能准确地识别正规集。它为词法分析程序的构造提供了方法和工具。
  • 有限自动机是具有离散输入输出系统的数学模型。它具有有限数目的内部状态,系统可以根据当前所处的状态和面临的输入字符决定系统的后继行为。其当前状态概括了过去输入处理的信息。

3.3.1 确定有限自动机(DFA)

在这里插入图片描述

3.3.2 非确定有限自动机(NFA)

3.2.3 DFA和NFA 等价条件

3.4 NFA 确定化⭐️

在这里插入图片描述

3.4.1 解决初始状态唯一性

3.4.2 简化弧上的标记

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BYNAetcR-1621077529511)(picture/20210116225405705.png)]

3.4.3 对含有ε的NFA 确定化⭐️

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pKABcvB0-1621077529516)(picture/20210117142223517.png)]

3.5 FA 化简⭐️

1) 状态的等价性

2) 化简算法

  1. 划分终态与非终态:
    I(1)={0, 1, 2},I(2)={3, 4, 5, 6}
  2. 写出Ia(1)={1, 3} ,发现分别落入两个子集,说明第一个子集应该继续划分:
    I(11)={0, 2},I(12)={1},I(2)={3, 4, 5, 6}
  3. 写出Ia(11) ={1},Ib(11)={2, 4},发现Ib(11)落入两个子集,应该继续划分:
    I(111) ={0},I(112) ={2},I(12) ={1},I(2)={3, 4, 5, 6}
  4. 前三个子集都只有一个元素,不需要看了,看最后一个子集
    写出Ia(2) ={3, 6},Ib(2) ={4, 5}
    发现这两个子集都在划分的这一子集中
    划分完毕,新子集为:{0} {1} {2} {3, 4, 5, 6}
    用3来代表4,5,6,对图进行化简:
    (所谓代表,就是456射出的弧,都由3来射出,射入也一样)
    在这里插入图片描述

至此,由NFA等价变换为DFA,并将得到的DFA化简的内容结束。

3.6 正规式和有限自动机的等价性

3.6.1 NFA–>正规式⭐️

  1. 在M的转换图上加进两个状态X和Y,从X用ε弧连接到M的所有初态结点,从M的所有终态结点用ε弧连接到Y,从而形成一个新的NFA,记为M’,它只有一个初态X和一个终态Y,显然L(M)=L(M’)。
    在这里插入图片描述
  2. 然后,反复使用下面的三条规则,逐步消去结点,直到只剩下X和Y为止。
    在这里插入图片描述
    即:增加弧上的标记,减少状态的数量。
  3. 最后,X到Y的弧上标记的正规式即为所构造的正规式r
    在这里插入图片描述
    显然L( r )=L(M’)=L(M)

3.6.2 数学归纳法

1) 验证r中的运算符数目为0时,结论成立。

若r具有零个运算符,则r=ε或r=φ或r=a,其中a∈Σ。
在这里插入图片描述
结论成立

2) 假设结论对于运算符数目少于k(k≥1)的正规式成立

r = r1|r2

在这里插入图片描述
于是:L(M)=L(M1)∪L(M2)=L(r1)∪L(r2)=L(r1|r2)= L( r )

r = r1·r2

在这里插入图片描述

于是:L(M)=L(M1)L(M2)=L(r1)L(r2)=L(r1·r2)=L( r )

r = r1*

于是:L(M) = L(M1)* = L(r1)* = L(r1*)= L( r )
至此,基于该假设,证明结论对于运算符数目为k的正规式成立。

3.6.3 算法与示例

在这里插入图片描述

最后得到:
在这里插入图片描述
我们还可以根据之前学到的子集法,把上面这个NFA化简为一个DFA。
在这里插入图片描述

有了这些等价关系,我们可以实现词法分析的自动生成。

3.7 正规文法和有限自动机的等价性

3.8 词法分析程序自动生成LEX

在这里插入图片描述
LEX的工作过程:

  1. 对每条识别规则Pi构造一个相应的非确定有限自动机Mi;
  2. 引进一个新初态X,通过ε弧,将这些自动机连接成一个新的NFA;
  3. 把M确定化、最小化,生成该DFA的状态转换表和控制执行程序。
    在这里插入图片描述

3.9 总结

标签:状态,教程,自动机,NFA,正规,词法,编译,终态,DFA
来源: https://blog.csdn.net/wujing1_1/article/details/116860008