编译原理-第二章:词法分析

概述

本章主要讲解编译器的第一个阶段,词法分析。完成这一工作的主要结构是词法分析器。即扫描器。

词法分析

在第一章的编译器结构图中我们可以知道,词法分析器将源程序(输入)转变成记号流(Token 流,输出)。工作原理如下图:
在这里插入图片描述
可以说它是为语法分析器服务,也可以将其看作是语法分析器的接收端。

介绍两个概念:

词法单元
又称单词,是编程语言中合法的字符串

词法记号
满足某种规则的词法单元,采用同一种记法。

满足一个给定规则(即模式)的词法单元,被记为一个词法记号
在这里插入图片描述
词法模式的表示方法,是词法记号描述的核心。

词法分析的作用类似于分词,由字符串流转变成词法记号流,而每个词法记号都具有一定的属性。

以一个例子来说明:
在这里插入图片描述
对于L1、x、y2(词法单元),它们都是ID(词法记号)。而如果对此法记号不赋予属性,原式子分析起来就会是:ID COLON ID ASSGN ID PLUS INT SEMI-COL,只保留了语法结构,失去了该有的含义。

语法错误

词法分析器对源程序采取非常局部的观点,难以发现下面的错误:
fi (a == f (x) ) …
例外的:如在实数是a.b格式下,可以发现下面的错误
123.
词法错误的补救方式:

  • “紧急方式”
  • 错误修补尝试
    • 删除一个多余的字符
    • 插入一个遗漏的字符
    • 用一个正确的字符代替一个不正确的字符
    • 交换两个相邻的字符
      在这里插入图片描述

模式

前面说过,模式就是匹配词法单元是否是一个词法记号的规则。而词法模式的表示方法,是词法记号描述的核心。
介绍一下模式语言(原谅我懒了一下):

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

正规式

在这里插入图片描述
正规式是用于说明词法单元如何对应到词法记号的模式。与非形式化的描述相比,正规式更具形式化,更加精确。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

状态转换图

词法记号的识别,相当于对字符串匹配的过程。而匹配过程基于状态转换图(有限状态机)来完成
一些状态转换图如示例如下:
在这里插入图片描述
在这里插入图片描述
一个圆的是初态(或中间状态),同心圆的表示终态,意思是在这个节点可以结束(也可以不结束,继续转换),没有到达终态,就意味着一定不结束。

在这里插入图片描述
如果想透彻了解状态转换图的逻辑和画法,建议自己练习尝试画几个。

有限自动机

定义:识别器:是一个程序,取串x作为输入,当x是语言的句子时,它回答“是”,否则回答“不是”。
有限自动机分为确定的有限自动机(DFA)和不确定的有限自动机(NFA)
两者实际上是空间和时间上的博弈:DFA转换速度快,但空间要求大。
DFA
在这里插入图片描述

在学习DFA之前,先来了解NFA
在这里插入图片描述

NFA的缺点:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

还是那句话,多画画才能学的明白

DFA和NFA的区别:
在这里插入图片描述
即,NFA可以将空作为转换边的条件
在这里插入图片描述
意思是说,DFA里头,每个节点对于a只能由一条出边,(可以有多个a的进入边)。NFA里头,就没有这个限制。

状态转换表

表示状态的转换情况,从开始状态到目标状态
假设正规式为:(a|b)*ab
NFA的状态转换表:
在这里插入图片描述
NFA状态转换图:
在这里插入图片描述
DFA状态转换表:
在这里插入图片描述
DFA状态转换图:
在这里插入图片描述

构造DFA

1、从自然语言描述中构造DFA

在这里插入图片描述
图中,0是终态。此外,数字分别表示余数,因为余数是固定的,且有且只有五种,容易确定。二进制数每增加一个0,数扩大两倍,(同样余数也是两倍的关系,但是3*2=6 ,余1,就跳转到1)。每增加一个1.数变为2n+1。

2、从正则表达式构造DFA

在这里插入图片描述

如何学?答曰:多画,多想。

3、从正则式到NFA再到DFA

先构造NFA
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
再构造DFA
理论依据:根据有限自动机理论,设L为一个有不确定的有限自动机接受的集合,则存在一个接受L的确定的有限自动机

子集构造法
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
解释一下,所谓的标记,其实就是看从这个状态出发,能到达的点。I0是初态在不进行任何匹配时所能到达的点(代表着,不通过匹配,也能达到,后面会提到,它们可能是无区别点)
对于I0,得到的值是X、5、1,在进行空集匹配时,可能在X、也可能在5、1开始下一个匹配。
然后对I0进行新的标记
在这里插入图片描述在这里插入图片描述
当出现值不一样时,就把这个集合记作新的标记,一直标记到没有新的集合出现。(不难,但很烦

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
另一个例子:
在这里插入图片描述
在这里插入图片描述

对DFA进行化简
如何判断DFA是不是最简

在这里插入图片描述
啥意思呢,我也不太懂这定义,咱用另一个图来理解
在这里插入图片描述
对于A来说,它经过a转化边到B,经过b转换边到D,算是一个过程。对于C而言,它经过a转换边到B,再经过b转化边到D。所以说,他们是不可区别的状态。不可区别的状态,很可能可以就是一个状态。可以进行化简合并。

化简途径:

  1. 根据状态是否可以区分,将状态划分成若干个集合,每个集合内的状态之间都不可区分,而任意两个集合中的元素都是可以互相区分的。
  2. 依据原始的DFA,在合并后的状态基础上,建立新的状态转换关系。

在这里插入图片描述
在这里插入图片描述
首先分为终结符和非终结符。即1。再对1中的多个元素的集合进行拆分。
相对于a转换边,A、B、C都是到达B。而对于b转换边,A、C到达的是C,B到达的D,所以,B和A、C不是一伙的,把他们拆开。然后以此类推,拆分到不能拆分为止。
举例说明:
在这里插入图片描述

计算机的实现

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

总结

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值