编译原理-第二章:词法分析
概述
本章主要讲解编译器的第一个阶段,词法分析。完成这一工作的主要结构是词法分析器。即扫描器。
词法分析
在第一章的编译器结构图中我们可以知道,词法分析器将源程序(输入)转变成记号流(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。所以说,他们是不可区别的状态。不可区别的状态,很可能可以就是一个状态。可以进行化简合并。
化简途径:
- 根据状态是否可以区分,将状态划分成若干个集合,每个集合内的状态之间都不可区分,而任意两个集合中的元素都是可以互相区分的。
- 依据原始的DFA,在合并后的状态基础上,建立新的状态转换关系。
首先分为终结符和非终结符。即1。再对1中的多个元素的集合进行拆分。
相对于a转换边,A、B、C都是到达B。而对于b转换边,A、C到达的是C,B到达的D,所以,B和A、C不是一伙的,把他们拆开。然后以此类推,拆分到不能拆分为止。
举例说明:
计算机的实现