编译原理-词法分析总结

课程总结

第三章词法分析我认为是比较难理解的一章。本文主要介绍在词法分析过程中需要用到的一些基本概念,包括词法单元、模式和词素以及三者之间的关系,理解这些内容对学习词法分析过程十分重要。

首先要了解词法分析的任务。词法分析的任务:从左至右逐个字符的对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为由单词符号串组成的程序。那么以词法分析为功能,词法分析器是将一个字母作为分析目标,根据该字母的下一个字母来判断是否应该判定该字母所属类型。它的输入是源程序,输出是单词符号。

编译原理-词法分析总结

如何识别单词符号呢?根据读来的第一个字符的种类分别转到各种子程序处理。这些子程序功能就是识别以相应字符开头的各种单词。分析的过程是这样的:通过判断下一个语句字符是否已经读过来,如果已经读过来,判断是字母、数字或者其他的,进入不同的子程序;如果没有读进来这个字符,就要读下一个字符。

什么是状态转换图?状态转换图是一张有限方向图,它的功能是识别或者接受一定的符号串或者说单词。有三个部分:结点、箭弧、箭弧上的标记。一个完整的状态转换图是有n个状态的,其中有一个状态,至少有一个终态。

关于正规表达式和有限自动机。把具有相同特征的字放在一起组成一个集合,即所谓的正规集
然后使用一种形式化的方法来表示正规集,即所谓的正规式。正规式是描述单词结构的一种形式;

正规集是该类单词的全集。

对于符号集合∑={a,b},有: 
- 正则表达式a表示语言{a}; 
- 正则表达式a|b表示语言{a,b}; 
- 正则表达式(a|b)(a|b)表示语言{aa,ab,ba,bb}; 
- 正则表达式a*表示语言{ε,a,aa,aaa,…}; 
- 正则表达式(a|b)*表示语言{ε,a,b,aa,ab,ba,bb,aaa,…}; 

- 正则表达式a|a*b表示语言{a,b,ab,aab,aaab,…}。

什么时候两个正规式相等?若两个正规式U和V所表示的正规集相同,则认为二者等价,记为:U = V。证明:b(ab)* = (ba)*b

证明:因为,L(b(ab)*)=L(b)L((ab)*) 
    ={b} · {ε,ab, abab, …}
    ={b, bab, babab, …}
又因为, L((ba)*b)=L((ba)*) L(b)
={ε, ba, baba, …} · {b}
={b, bab, babab, …}
因此, L(b(ab)*)= L((ba)*b)
所以, b(ab)*=(ba)*b
正规式的性质:设U,V,W是上的∑正规式,则
(1) U | V = V | U 或的交换律
(2) U | ( V|W ) = ( U|V ) | W 或的结合律
(3) U ( VW ) = ( UV ) W 连接积的结合律
(4) U ( V | W ) = ( UV ) | ( UW ) 分配律
     ( V | W ) U = VU | WU

(5) εU = Uε = U

把状态转换图再形式化一下就是有限自动机(确定的有限自动机,非确定的有限自动机)。需要注意的是,所谓的自动机不是指一台实际的机器,而是一种数学模型(集合,函数,序列…),利用它模拟计算机识别的功能。所谓确定性是指,f(s, a) = s’ 是单值函数。 对任何状态s∈S,和输入符号 a∈∑ , f(s, a) 唯一的确定下一个状态。所谓有限性是指,S是一个有限的状态集合,并且∑是一个有限的输入符号的字母表。用上述5条,来定义一个DFA,来完成识别一个序列是否被机器所接受。

eg. 设DFA M = ({0,1,2,3},{a, b}, f, 0, {3}),其中

f: f(0, a) = 1, f(0, b) = 2 。  f(1, a) = 3, f(1, b) = 2 。 f(2, a) = 1, f(2, b) = 3 。   f(3, a) = 3, f(3, b) = 3编译原理-词法分析总结

若M的初态结点同时又是终态节点,则空字可被M识别。DFA M所能识别的字的全体记为L(M)。如果一个DFA M的输入字母表为∑,则我们称M是∑上的一个DFA。若V是∑上的一个正规集,当且仅当存在一个∑上的DFA M,使得V = L(M)。

对任何两个有限的自动机M1和M2,若有L(M1)=L(M2),则称M1与M2等价。 对于任何∑上NFA M都可构造一个∑上的正规式V,使得  L(V) = L(M) 。

使用替换规则逐步消去M’的所有结点。替换规则如下:

编译原理-词法分析总结

还有关于闭包的概念。假定I是M’的状态集的子集,a ∈ ∑,定义Ia =ε_CLOSURE(J)。其中,J是所有那些可从I中的某一状态结点出发经过一条a弧而到达的状态结点的全体。

关于确定有限自动机的化简(最少化)。寻找一个状态比DFA M少的DFA M’,使得 L(M’) = L(M)。两个状态等价:设s和t是M两个不同的状态,从s出发能读出某个字而停于终态,那么同样,从t出发也能读出同一个字而停在终态,反之亦可。DFA化简算法:把M的状态集分割为一些不相交的子集,使得任何不同的两个子集状态都是可区别的,而同一个子集中的任何状态都是等价的,最后让每个子集选一个代表,同时消去其他等价状态。化简步骤:(1) 检查状态转换函数是否为全函数。(2) 用化简算法进行化简。(3) 去掉死状态。

课后习题

做课后习题是划题做的,把比较重要做了做(在打草纸上... 等我去拍上来)。订正版:

编译原理-词法分析总结

编译原理-词法分析总结

编译原理-词法分析总结

编译原理-词法分析总结补充:

编译原理-词法分析总结

感想

学完这一章,感觉是挺难以理解的。老师说可以自己写一个词法分析器。坦白地说,我只看了一下原理和代码,测试运行而没有自己实践,是一个不足之处;另外在做习题时,因为细节处理,可能会产生连环错误,一步错步步错,所以从一开始做题就要保持细心;词法分析是语法分析的基础,概念性的东西和流程性的东西比较强,其实套路摆在那,明白套路加以练习就可以基本掌握了。

词法分析器

输入缓冲区:成对且对半互补的输入缓冲区模式。n: 取2的整次幂;每个半区的末尾设置标志“ eof ” 表示读入该半区的源程序的结束;B:单词w开始指针; F:扫描w的指针。

两个缓冲区的输入模式预处理程序: (作用)
1) 减少内存空间占用;
2) 减轻扫描器实质性处理的负担;
预处理程序主要任务: 1) 滤掉源程序中的非单词成分(如无用空格;换行符等);2) 其他的预处理工作:滤掉注释;宏替换;文件包含的嵌入;条件编译的嵌入。