词法分析

       在词法分析这一章主要通过学习了词法分析、正规表达式和有限自动机来了解词法分析器的构造。

       词法分析器是执行词法分析的程序。将源程序输入词法分析器后,词法分析器从左至右逐个字符的对源程序进行扫描,输出相应的单词符号,把字符串形式的源程序改造成为由单词符号串组成的程序。输出的单词符号一般分为:基本字(保留字、关键字)、标识符、常数、运算符、界符。通常用二元式表示:<单词种别,单词符号的属性值(反映单词特性或特征的值)>。下图为词法分析器的结构图:

                            编译原理——第三章词法分析总结

根据上图简单介绍词法分析器的工作流程。将源程序输入词法分析器之后,为方便单词识别很多情况下都会把源程序放入输入缓冲区中进行预处理。将输入串中的无用的空白、跳格(TAB)、回车、换行等编辑性字符以及注释行剔除(若空白符号为单词符号的界符,就将若干空白和并为1个),处理之后源程序变为一段确定长度的输入字符。将输入字符放入缓冲区中进行单词识别,单词识别主要有3种方法:超前搜索——在单词识别的过程中向前多读几个符号,这种方式相对准确,但是扫描指针需要多次回退;直接分析法——根据读到的第一个字符的种类转到不同的子程序处理,通过条件判断的方式提高效率;状态转换图法——使用状态转换图设计词法分析程序。状态转换图法是一种很好的方式,作为重点介绍。首先介绍状态转换图,状态转换由结点(代表状态,用圆圈表示)、箭弧及箭弧上的标记(在射出节点下可能出现的字符或字符串)三部分组成,可用于识别字符串, 有一个初态,至少要有一个终态(用双圆圈表示),需要注意当终态后有一个“*”表示在该状态下多读进一个字符,需退回。

      首先了解正规式的概念,把具有相同特征的字放在一起组成一个集合叫做正规集,然后使用一种形式化的方法来表示正规集,这种表示方法就是正规式。正规式满足交换律(“或”形式的时候满足)、结合律、分配律,运算时要注意符号的优先级为:“ * ”  >  “ · ”   >  “ | ”,当且仅当两个正规式所表示的 正规集相同时,正规式等价。下面介绍有限自动机,有限自动机实际上就是状态转换图的形式化表示。有限自动机可分为确定有限自动机(DFA)和非确定有限自动机(NFA),都可用五元式(M= (S, ∑, f, s0, F))、状态转换图和状态转换矩阵表示,二者区别在于,确定有限自动机的初态唯一,映射S× ∑→S为单值函数,而非确定有限自动机的初态不唯一且为非单值映射。有限自动机的识别功能表现在对于∑*中任何字α,如果存在一条从初态结点到某个终态结点的道路,且这条路上所有的标识符连成的字(NFA忽略空字ε)等于α ,则α可被识别,所能识别的字的全体记为L(M)。由定义容易看出看出DFA为NFA的一种特例,则一定在某些条件下可将NFA确定化为DFA,这里采用子集法,即将准状态转换表中的每个状态子集视为新状态继续构造。由于正规式和有限自动机存在等价性,所以二者可以用各种替换规则进行转换。有限自动机还有一个重点就是确定有限自动机的化简,所谓化简即寻找一个状态比DFA M少的DFA M’,使得L(M’) = L(M)。转换与化简都将在下面的习题体现。

习题:

1.构造下面正规式相应的DFA

1(0|1)*101

解:

                    编译原理——第三章词法分析总结

知识点:由一个正规式V,构造一个DFA M

      由于正规式和有限自动机存在等价性,即任何正规式r都存在一个FA M,使得L(M) = L(r),则正规式可以转换成有限自动机,转换步骤为:(1)根据V,构造一个NFA M’,使得L(M’) = L(V)。构造一个拓广的转换图,利用替换规则将V分解,加入新的结点,直到把图转换成每条弧上标识为∑上的一个字符或ε;(2)将M’确定化,变为DFA M。用子集法找到每个输入字符x的J(可从I中的某一状态结点出发经过一条x弧而到达的状态结点的全体)和ε_CLOSURE(x)。

2.给出下面正规式的表达式

(1)以01结尾的二进制数串

(2)能被5整除的十进制数

解:(1)(0|1)*01

      (2)S→BC*A|A

              A=0|5

              B=1|2|3|4|5|6|7|8|9

              C=0|1|2|3|4|5|6|7|8|9

知识点:正规式 闭包

      正规式用来表达具有相同特征的字的集合。根据题目分别找到字的相同特征,利用“或”、连接运算、闭包运算总结正规式。以第二题为例分析:5整除的十进制数分为两类,个位数和多位数,所以首先加一个或运算,多位数|个位数;个位数只能是0|5,多位数的第一位不为0,所以为1~9的自然数,中间位可以有也可以没有,所以为0~9的自然数的闭包,易得结果如上。

3.将下图分别确定化和最小化

确定化:

                   编译原理——第三章词法分析总结

最小化:

                    编译原理——第三章词法分析总结

知识点:有限自动机的确定化和最小化

      确定化:首先用子集法将当前图变成一张状态转换表,将每个子集看成一种新状态加入,直到不再有新状态,得到DFA M,此时DFA 中凡是含有原图终态的状态都是终态,如本题中原图终态为{0},DFA终态则为{0}和{0,1}即状态1、2。

      最小化:用化简算法进行化简,把自动机的状态集分割为一些不相交的子集(一开始可分为终结状态和非终结状态),使得任何不同的两个子集状态都是可区别的,而同一个子集中的任何状态都是等价的,若将字符输入子集的结果属于终结状态的集合,则该子集不用再分,否则再分,最后从每个子集选一个代表,同时消去其他等价状态

总结:

       本章学习词法分析,在有限自动机部分有很多状态转换的运算题:正规式转化成有限自动机、非确定有限自动机转化成确定有限自动机、确定有限自动机的化简,步骤看起来相似又比较多,在做的时候首先要确实弄清楚什么是确定状态自动机,什么是非确定状态自动机,了解二者区别,这样不容易混淆步骤也更容易理解。几种转化都运用了状态转换图,掌握状态转换图画法,列状态转化表的时候仔细,题目就比较好做了。本章学习之后会理解词法分析器的设计原理,另一个难点就是如何将词法分析器用代码形式表现。努力。



相关文章: