Loading [MathJax]/jax/element/mml/optable/GreekAndCoptic.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >编译原理:第三章 词法分析

编译原理:第三章 词法分析

作者头像
Here_SDUT
发布于 2022-08-09 12:47:44
发布于 2022-08-09 12:47:44
4.8K00
代码可运行
举报
运行总次数:0
代码可运行

一、 词法分析程序的设计(理解)

1.1 词法分析主要功能

从左至右逐个字符地对源程序进行扫描,产生 一个个的单词符号,把作为字符串的源程序改造成为单词符号串的中间程序或者说:逐个读入源程序字符,并按照词法规则分割成一系列单词,再转换成单词串,同时进行词法检查

主要任务:读源程序,产生单词符号。

其他任务:滤掉空格,跳过注释、换行符;宏展开,……

关键:找出单词分隔符。

1.2 单词符号的分类

单词符号一般可分为下列五种:

  • 关键字 C语言main int void
  • 标识符 变量名 数组名 函数名
  • 常数 100 3.14159 ‘a’
  • 运算符 + – * /
  • 界符 ,;( ) /* */

1.3 词法分析的输出

词法分析程序从左到右读入源程序,进行分析后输出相应的单词符号,用于表示单词符号的特性。通常以二元式(单词种别,属性值)的形式输出。

如果一个种别只含一个单词符号,则不需属性值,属性值设为空。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
关键字 if (“if”,_ )

关键字 then (“then”,_ )

一个种别含有多个单词符号,为区别各个单词符号需要属性值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
变量 i (1,指向i的符号表项的指针)

关键字 if3,“if”)

关键字 then (3,“then”)

举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while (i>=10) i--;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  单词           输出表示
1 while      (3,“while)
2  (         (5,“()
3  i         (1,指向i的符号表项的指针)
4  >=        (4>=)
5  10        (2,“10) 
6  )         (5,“))
7  i         (1,指向i的符号表项的指针)
8 - -        (4- -)
9  ;         (5;)

1.4词法分析器的组织方法

  • 作为单独的一遍,在语法分析前进行。
  • 与语法分析结合在一起作为一遍。作为语法分析程序的一个子程序,每次调用识别一个单词,交给语法分析器使用,如下图所示。

二、 单词的描述工具(理解)

正规集(正规语言):某字母表上,我们感兴趣的符号串的集合。

正规表达式(regular expression):是定义正规集(正规语言)的一种表示法。

正规文法:是对正规语言(正规集)的一种描述工具。

2.1 正规文法

程序设计语言中几类单词的规则描述:

<标识符>→ l|l <字母数字>

<字母数字>→l|d|l <字母数字>|d <字母数字>

<无符号数>→d|d <无符号数>

<运算符> →+|-|*|/|=|< <等号>|> <等号>……

<等号>→=

<界符>→,|;|(|)|……

2.2正规式和正规集

2.2.1 定义

正规式和正规集的递归定义为:

举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
设 ∑={a,b} 
    正规式              正规集  
     ba*               ∑上所有以b为首后跟任意多个a的字
   a(a|b)*             ∑上所有以a为首的字
(a|b)*(aa|bb)(a|b)*    ∑上所有含有两个相继的a或两个相继的b的字


设∑={A,B,0,1}
    正规式          正规集  
(A|B)(A|B|0|1)*    ∑上的“标识符”的全体
  (0|1)(0|1)*      ∑上的“数”的全体

2.2.2 正规式运算符的优先级

* 高于.

. 高于|,具有结合律、分配律,可省略

| 具有交换律、结合律

( )指定优先关系

2.2.3 正规式的性质

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
U|V=V|U (交换律)

U|(V|W)=(U|V)|W (结合律)

U(VW)=(UV)W (结合律)

U(V|W)=UV|UW (V|W)U=VU|WU (分配律)

εU=Uε=U

2.2.4 正规式的等价性

一个正规式 r 表示的正规集也就是 r 所定义的语言,记为 L(r),若两个正规式r和s所表示的正规集L(r)=L(s),则称r,s等价,记作 r = s。

三、 有穷自动机(掌握 重点 难点)

定义:是一种识别装置,能准确地识别正规集(正规语言)有限自动机是具有离散输入输出系统的数学模型;它具有有穷数目的内部状态,概括了对过去输入处理的信息,根据当前所处状态和面临输入即可决定系统的后继行为。

3.1 确定有限自动机

3.1.1 定义

确定的有限自动机DFA M是一个五元组:

(1) S 是一个非空有限集,它的每个元素称为一个状态。

(2) 是一个有穷字母表,它的每个元素称为一个输入符号,所以也称为输入符号字母表。

(3) δ是状态转换函数,是在上的单值映射。

定义形式:,其中

含义: 在当前状态为,输入符号为 a 时,将转换为下一状态,我们把称为的一个后继状态。

(4) ,是唯一的一个初态。

(5) ,可空,是一个终态集,终态也称可接受状态或结束状态。

3.1.2 自动机举例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                  状态集   字母表  初态 终态
例如有DFA   M =({0,1,2,3},{a,b},δ,0,{3})
其中δ定义为:δ(0,a)=1  δ(0,b)=2
           δ(1,a)=3  δ(1,b)=2
           δ(2,a)=1  δ(2,b)=3
           δ(3,a)=3  δ(3,b)=3

状态转换矩阵和状态转换图:

其中 - 示初态 + 表示终态。

3.1.3 DFA识别过程

设DFA

定义:

,则,表示在状态下输入符号a可达状态 ,或者有通路,通路上的字符串为a。

,表示 有通路,通路上的符号串为

,则称α可为M所接受(识别,读出)。

解释:若对于∑中的任何字α,若存在一条从初态结点s0到某一终态结点的通路,且这条通路上所有弧的标记符连接成的字等于α,则称α可为DFA M所识别(读出或接受)特别地,若初态结点同时又是终态结点,则空字ε可为DFA M所识别。

DFA M 所能接受的字符串的全体为 :

,若,若

例如:状态0到状态3有通路,通路上的字符串为aa,同时可以为babba。

3.2 非确定有限自动机NFA

3.2.1 定义

一个NFA M是五元式

S 有穷非空状态集合

有穷的输入字母表集合

δ 从映射,其中 表示 S 的幂集。

是S的非空子集,称为初始状态集合。

是S的子集(可空),称为终止状态集合。

一个含有m个状态和n个输入的NFA可以描述成一张状态转换图,这张图含有m个状态节点,每个节点可以射出若干条箭弧与别的节点相连,每条弧用 中的一个串作为标记,整个图至少含有一个初态节点和若干个终态节点。

若对于∑中的任何字α,若存在一条从初态结点s0到某一终态结点的通路,且这条通路上所有弧的标记符连接成的字等于α,则称α可为NFA 所识别(读出或接受)特别地,若初态结点同时又是终态结点或者存在一条从初态节点到终态节点的空边,则空字ε可为DFA M所识别。

NFA和DFA的不同在于:

  • δ的值域是S的子集,
  • 开始状态有不止一个
  • 接受ε作为输入符号

3.2.2 NFA的确定化

若规定NFA的初态集中只有唯一一个元素,即NFA的初态唯一,且状态转换函数单值,则该NFA即为DFA。

DFA是NFA的特例:

对每一个NFA N一定存在一个DFA M,使得L(M)=L(N)即对每个NFA N存在着与之等价的DFA M。

注意:与某一NFA等价的DFA不唯一。

3.3.3 NFA确定为DFA的原因

使用NFA判定某个输入符号串的时候,可能出现不确定的情况:不知道下面选择哪个状态。如果选择不好,该输入符号串可能不能到达终止状态。但是,我们不能说该输入符号串不能被该NFA接受。如果通过尝试的方法,不断试探来确定输入符号串是否可被接受,那么判定的效率将降低。解决的方法是将NFA转换为等价的DFA。此外,用来描述语言的正规式更容易构造出识别同一语言的NFA。

3.3.4 NFA的确定化:子集法

基本思想:

让DFA的每一个状态对应NFA的一组状态。即让DFA使用它的状态去记录在NFA读入一个输入符号后可能达到的所有状态——子集。

定义两个运算:ε-closure(I)和move(I,a):

ε-closure(I):

状态集合 I 的ε闭包,定义为一状态集记为: ε-closure(I),是

(1)若q∈I,则q∈ε-closure(I);

(2)若q∈I,那么从q出发经任意条ε弧而能到达的任何状态q’都属于ε-closure(I)。

理解:就是 状态集合 I 本身加上所有可以通过任意条 ε边到达的节点。

例如:

move(I,a):

设 I 是M的状态集的子集,a∈∑

状态集合I的a弧转换 ,定义为一状态集J记为:J=move(I,a)

J是可从I中的某一状态结点出发经过一条 a 弧而到达的状态结点的全体。

为了便于说明,记,即,白话就是等于集合 先通过一条 a 边可以转移到的点加上从这些点经过任意条ε边可以到达的点的集合。

算法过程:

对给定的NFA N构造一张表,表的构成如下:

(1)设∑={ a1,…, ak },表的每行含有k+1列。

(2)置首行首列(最左上角的格子)为ε-closure(S0)。

(3)若某行首列状态子集已确定,记为I,则置该行的第i+1列为

(4)检查该行所有状态子集,将未出现在第一列者填入到后面空行的第一列。

(5)重复(3)(4)直到第一列中状态子集不再扩大为止(在第i+1列上的所有状态子集均已在第一列上出现)。此时,将该表看成是一个状态转换矩阵。

(6)将该状态转换矩阵中所有状态子集重新命名,得到状态转换矩阵,其所示的是与给定的NFA N等价的DFA M(未化简的DFA)。

注意:DFA M的初态为该表第一行第一列的状态。DFA M的终态为含有原NFA N的终态的状态子集 。

3.3 DFA的化简

一个确定有限自动机 M 的化简是指:寻找一个状态数比 M 少的 DFA M’,使得 L(M’)=L(M)。

假定s和t是M的两个不同状态:

  • s和t是等价的 如果从状态s出发能读出某个字w而停于终态,从状态t出发能读出同样的字w而停于终态;反之亦然。
  • s和t是可区别的 如果从状态s开始输入w使得结束时候的状态为终止状态,而从t开始输入w时,结束的状态为非终止状态(或无状态),那么我们说w把s和t区别开来。

3.3.1 判断DFA最小

条件1: 无多余状态,即从初态出发,任何输入串都不能到达的状态。

条件2:无相互等价的两个状态。

两个状态等价的条件(不等价称为可区别的):

  • 一致性条件:s、t同为终态或非终态
  • 蔓延性条件:对所有输入符号,s、t必须转换到等价的状态集中,同时具有传递性。

3.3.2 化简步骤

步骤1: 将DFA的状态集分为互不相交的子集使得任何不同的两子集中的状态都是可区别的,而每个子集中的任何两个状态是等价的。

步骤2: 每个子集中选取一个状态作为子集中所有状态的代表,其余删除,这些代表构成了化简后的自动机的状态集合,到达被删除状态的弧引入该子集的代表状态。

步骤3: 删除无用状态。

步骤4: 初始状态为包含有原初态的子集的代表,终止状态为包含有原终态的子集的代表。

3.3.3 分割算法(化简步骤1)

步骤1: 初始分划:终止状态和非终止状态

步骤2: 重复对于每一组 I 都进行下列细分,直到不能再细分为止:

  • 将 I 分成子组,使得 s,t 在一组当且仅当对于任何的输入符号,他们的后继都属于同一个小组。
  • 将子组加入到分划中替换 I

注意: 前面发现的不能细分的小组后来可能还可以细分。所以重复步骤2的时候要检验所有的组,包括老的和新加入的。

例子:

  1. 对状态集的划分如下:7个状态分成两组
  2. 考察处理

等价 等价等价。不可再分。

  1. 考察处理 ,1和3可区别, 细分成
  2. 考察处理 2和4可区别细分成
  3. 最终共分成4组:
  4. 保留一组中的任意一个,比如保留3,删除4,5,6,2经b到4 改为2经b到3,4经b到4 改为3经b到3,其它重复以上修改。
  5. 化简后的DFA:

四、 正规式和有穷自动机的等价性(掌握 重点 )

4.1 从NFA M构造正规式 r

第一步:在M中引进新的初态结点X和终态结点Y,形成M’,使得: ,那么M’就只有一个初态X和一个终态Y。

第二步:反复使用下面的替换规则消去M’中的所有结点,逐步用正规式来标记弧:

第三步:结点X和Y之间弧上的标记,即为所求正规式r。

4.2 从正规式 r 构造NFA M

4.2.1 替换规则

  1. 若 r 具有零个运算符,则 r =ε或 r =∧ 或 r=a,对应的三个状态转换图如下:
  1. 当 r 中含有 k 个运算符时,分下列三种情况 r = r1| r2 r = r1 r2 r = r1* ,对应的三个状态转换图如下:

4.2.2 构造方法

1.首先画上有两个结点X、Y的转换图,由X指向Y的弧上标记为正规式r,形成只有一个初态和终态的NFA

2.然后分解弧上正规式,用替代规则引入新状态结点,所有的新结点取不同的名字但同一结点的不同射出弧可以同名

3.直到所构造的FA中每条弧上都标记为单输入符号为止

4.用子集法将NFA确定化,用划分法将DFA最小化

4.2.3 举例

已知正规式试给出能识别 的确定有限自动机NFA

4.3 综合例题

已知正规式 试给出能识别的确定有限自动机DFA

4.3.1 由r构造NFA

4.3.2 NFA确定化子集法

4.3.3 DFA最小化 划分法

五、 正规文法和有穷自动机的等价性(了解)

对于正规文法G和有限自动机M,如果 L(G)=L(M),则称G和M是等价的

(1)对于每一个正规文法G,都存在一个有限自动机FA M,使得L(M)=L(G)

(2)对于每一个有限自动机FA M,都存在一个正规文法G,使得L(G)=L(M)

即:对于每个正规文法都能找到一个有限自动机对应,每个有限自动机都有一个正规文法对应。另外,对任何正规文法,存在定义同一语言的正规式,对任何正规式,存在生成同一语言的正规文法。

三者的关系:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-9-26 1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
编译原理学习笔记-4:词法分析(二)等价转换与DFA的化简
正规文法(四元式)定义了某种正规语言,正规式表示了某个正规集,它也定义了某种正规语言,因此可以说正规式和正规文法是等价的。即:
Chor
2020/04/26
4.1K0
编译原理学习笔记-4:词法分析(二)等价转换与DFA的化简
编译原理从入门到放弃
大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了 研究生入学考试 的必考内容。我觉得有了解的必要性,文章由自己理解汇总,以达到考试及格为目的,若有错误,请留言指正,谢谢~
Lcry
2022/11/29
9390
编译原理从入门到放弃
编译原理学习笔记-3:词法分析(一)基本过程、正规式和有限自动机
词法分析的任务是:从左往右逐个字符地扫描源程序,产生一个个的单词符号。也就是说,它会对输入的字符流进行处理,再输出单词流。执行词法分析的程序即词法分析器,或者说扫描器。
Chor
2020/04/13
12.1K0
编译原理复习总结-耗子尾汁
2. 上下文无关法 一个上下文无关法G是一个四元式 ,其中 :终结符集合(非空) :非终结符集合(非空),且
唔仄lo咚锵
2021/12/31
1.3K0
编译原理复习总结-耗子尾汁
编译原理:第二章 文法和语言
在不同语言中完全相同的语法单位,含义却可能完全不同,例如:x=y 在C语言中表示赋值表达式,在Pascal语言中为关系表达式。
Here_SDUT
2022/08/09
2.1K0
编译原理:第二章 文法和语言
编译原理:2. 词法分析
词法的(Lex-i-cal):与语言的单词或词汇有关,但有别于语言的文法和结构的。
浪漫主义狗
2023/09/04
8220
编译原理:2. 词法分析
怎么设计高效的敏感词过滤系统(一)
IM项目需要对上边传输的消息进行必要的过滤。如果总是对着某人输入f**k就显得不太文明了。
普通程序员
2019/10/23
7.6K1
怎么设计高效的敏感词过滤系统(一)
python实现DFA模拟程序(附java实现代码)
这是我在课程中的一个实验,代码手写并且可运行,是参照一个java版的代码实现的,加上自己的理解和思路把它以python的形式实现。学习别人好的地方,当然也不能照搬别人,不然能够为己用的东西少之又少。通过不同的编程语言把整个思路在理一遍能够加深自己的理解,并且能够得到一样的运行结果,说明自己的理解是对的。最后也附上对应的java版代码,有需求的童鞋可以参考喔! 欢迎访问我的个人网站www.chlinlearn.cn
chlinlearn
2022/05/10
6700
python实现DFA模拟程序(附java实现代码)
编译原理学习(到LL1文法部分)
机器语言:计算机只认识由0和1构成的机器语言,每台机器自己独特的指令系统即机器语言。 机器语言->汇编语言->高级语言 编译程序最初的定义是把一种高级语言设计的源程序(面向人的)翻译成另一种等价的低级程序设计语言(面向硬件的)即机器语言或汇编语言。
且陶陶
2023/04/12
8750
编译原理学习(到LL1文法部分)
编译原理:第六章 LR分析
LR分析法是一种自下而上语法分析技术,L表示从左到右扫描输入符号,R表示构造一个最右推导的逆过程——最左归约,k表示超前读入k个符号,以便确定归约用的产生式。一个LR分析器由3部分组成:
Here_SDUT
2022/08/09
1.6K0
编译原理:第六章 LR分析
编译原理 | 期末复习笔记
warning: 这篇文章距离上次修改已过396天,其中的内容可能已经有所变动。
Ranlychan
2023/03/05
1.8K0
编译原理 | 期末复习笔记
编译原理(第四版)复习 (二)
第三章:词法分析与有穷自动机 考察内容就是:已知文法求正规式;已知正规式求文法; 正规式的性质: A|B = B|A A|(B|C) = (A|B)|C A(BC) = (AB)C A(B|C) = AB|AC (A|B)C = AC|BC A(伊姆逊)|(伊姆逊)A = A A* = AA*|(伊姆逊)=A|A* = (A|(伊姆逊))* (A*)* = A* 正规文法到正规式的转换: 将正规文法中的每个非终结符表示成关于它的一个正规式方程,获得一个联立方程组; 依照求解规则: 若x=ax|b 或
meihuasheng
2021/03/18
5190
《软考高分必备!程序语言设计6分速通:编译VS解释全拆解+函数调用通关秘籍,词法/语法/语义三阶冲刺!》【附真题解析】
本文旨在从题目出发,只保留真题考到的相关的概念,都是浓缩过的知识点,所以简练而精髓,每一个知识点后都附带真题解析,各位小伙伴可以自行点开观看,方便复习。
摘星.
2025/05/20
1390
《软考高分必备!程序语言设计6分速通:编译VS解释全拆解+函数调用通关秘籍,词法/语法/语义三阶冲刺!》【附真题解析】
编译原理自动生成LR(0)分析表Python实现
对于LR文法,我们可以自动构造相应的LR分析表。为了构造LR分析表,我们需要定义一个重要概念——文法的规范句型“活前缀”。
里克贝斯
2021/05/21
1.9K0
编译原理自动生成LR(0)分析表Python实现
编译原理 第三章上 :词法分析 状态图的画法与检验
扫描源程序字符流,按照源语言的词法规则识别出各类单词符号,并产生用于语法分析的符号序列。
小徐在进步
2024/09/21
4600
编译原理 第三章上 :词法分析 状态图的画法与检验
简单的词法设计——DFA模拟程序
通过实验教学,加深学生对所学的关于编译的理论知识的理解,增强学生对所学知识的综合应用能力,并通过实践达到对所学的知识进行验证。通过对 DFA 模拟程序实验,使学生掌握词法分析的实现技术,及具体实现方法。通过本实验加深对词法分析程序的功能及实现方法的理解 。
Angel_Kitty
2019/01/07
2.1K0
词法分析
对任意正则文法G,存在定义同一语言的正则表达式r。 对任何正则表达式r,存在生成同一语言的正则文法G
code-child
2023/05/30
3190
词法分析
编译原理题练习题测试题
(3)如果是二义的,将其改为无二义的,其优先级从高到低依次是not, and, 和 or。
张哥编程
2024/12/19
1870
编译原理学习笔记-5:自顶向下语法分析
在词法分析中,我们扫描输入源程序的每个字符,得到多种类型的单词(token),一系列的单词就构成了一条单词流。可以设想,单词流的某个部分有多个并排的单词,它们可能会构成某个句子,但是这个句子是否真的符合语法规则呢?我们需要借助语法分析器才能进行判断。更直接点,我们可以说语法分析器是用来判断句子是否符合某个给定的上下文无关文法的。
Chor
2020/05/12
5.3K2
编译原理 期末速成
问题:源代码中括号不匹配的错误一般在编译的哪个阶段(采用五阶段划分模型)被检查出来,简述这一阶段的名称和主要任务
IsLand1314
2025/05/25
3100
编译原理 期末速成
推荐阅读
相关推荐
编译原理学习笔记-4:词法分析(二)等价转换与DFA的化简
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档