词法分析器是执行词法分析的程序,词法分析的任务是:从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。
词法分析的功能是输入源程序,输出单词符号。单词符号是程序语言的基本语法符号,一般分为关键字、标识符、常数、运算符、界符。词法分析器所输出的单词符号表示为:<单词种别,单词符号的属性值>。应用见课后题第二题。
下面是关于词法分析器的设计,首先要了解词法分析器的结构:
输入源程序文本,放入输入缓冲区中,词法分析工作可在这个输入缓冲区中工作。剔除无用的空白,跳格(TAB),回车,换行等编辑性字符;若空白符号为单词符号的界符,就将若干空白和并为1个。剔除注释行,比如/*…*/。源程序的出错列表打印。将预处理好的子程序放到扫描缓冲区中。扫描缓冲区设两个半区,可互补使用。设起点指针和搜索指针两个指针。而扫描器就可以直接扫描缓冲区,进单词识别。
接下来是对于单词符号的识别。超前搜索:在单词识别的过程中,通过向前多读几个符号的形式,准确的进行单词的识别一旦确定识别到的单词之后,需要进行扫描指针的回退,保证单词识别工作的顺利进行。直接分析法:根据读来的第一个字符的种类分别转到各种子程序处理。这些子程序功能就是识别以相应字符开头的各种单词。最后,还有状态转换图法(有向图)。
本章重点:正规表达式与有限自动机
正规集与正规式:我们可以把具有相同特征的字放在一起组成一个集合,即所谓的正规集然后使用一种形式化的方法来表示正规集,即所谓的正规式。【注】正规式是描述单次结构的形式(文法),而正规集是描述文法的语言。掌握正规式的等价和五个性质。应用见课后题。
有限自动机分为确定有限自动机和非确定有限自动机。
一个确定有限自动机(DFA)M是一个五元式:
M = (S, ∑, f, s0, F),其中
S是一个有限的状态集合,它的每个元素我们称为一个状态。
∑是一个有穷的输入符号的字母表,它的每个元素我们称为一个输入字符。
f是从 S×∑ →S的单值部分映射。
s0是S的一个元素,为初始状态,它是唯一的。
状态集合F是终止状态的集合,它是S的子集(可空)。
可以用状态转换矩阵来表示:
![](https://i-blog.csdnimg.cn/blog_migrate/ef1ab32c94cf9bd4b4370af43ed68088.png)
一个非确定有限自动机(NFA)M是一个五元式
M = (S, ∑, f, S0, F),其中
1) S是一个有限的状态集合,它的每个元素我们称为一个状态
2) ∑是一个有限的输入符号的字母表,它的每个元素我们称为一个输入字符
3) f是从S×∑*→2S 的部分映射,其中,2S表示S的幂集合(所有S的子集组成的集合)
(f是非单值的àM是非确定)
4) 状态集合S0是初始状态集合,它是S的子集
5) 状态集合F是终止状态的集合,它是S的子集
同样,一个非确定有限自动机也可以用状态矩阵和状态转换图来表示。
定理1:对于任何∑上NFA M都可构造一个∑上的正规式V,使得 L(V) = L(M)
其中,L(M)是∑上NFA M所能识别的字的全体L(V)是∑上的正规集
由一个NFA M,构造一个正规式V方法:
(1)在M转换图上加进X结点和Y结点,从X结点用弧ε连接M的所有初态结点,M的所有终态结点用弧ε连接到Y,得到一个NFA M’,且L(M) =L(M’)
(2)使用替换规则逐步消去M’的所有结点,直到只剩下X结点和Y结点,在消去过程中,逐步使用正规式来标记箭弧
定理2. 对于∑上的每一个正规式V,存在一个∑上的DFA M,使得L(M) = L(V)
由一个正规式V,构造一个DFA M:
(1)根据V,构造一个NFA M’,使得L(M’) =L(V)
(2)将M’确定化,变为DFA M
用子集的方法确定化:构造一张表,把每个集合看成一个状态,得到状态转换表,并得到处态和终态。这样就变成了DFA M。
最后是确定有限自动机的化简。
基本思想:把M的状态集分割为一些不相交的子集,使得任何不同的两个子集状态都是可区别的,而同一个子集中的任何状态都是等价的,最后让每个子集选一个代表,同时消去其他等价状态。
算法:
①对M的状态集S进行划分:
把S的终态和非终态分开,分成终态集合非终态集,形成基本分划П,显然这两个子集是可区别的。
②假定到某个时候П含有m个子集,
记П={I(1),I(2),… I(m)}
并且,属于不同子集的状态是可区别的。
检查П中的每个I(i)看能否进一步划分:
对于某个I(i)
另I(i)={q1 ,q2,…,qk}
若存在一个输入字符a使得I(i)a不全包含在现行П的某个子集I(j)中,就将I(i)一分为二
③一般地,若I(i)a落入现行П中N个不同子集,则应将I(i)划分为N个不相交的组,使得每个组J的Ja都落入П的同一子集,这样再形成新的分划
④重复上述过程,直至分划中所含的子集数不再增长为止。至此,П中的每个子集已不可再分。也就是说,每个子集中的状态是互相等价的,而不同子集中的状态则是互相可区别的。
⑤经过上述过程后,得到一个最后分划П.对于这个П中的每个子集,选取子集中的一个状态代表其它状态。
[例如,假定I={q1 ,q2,…,qk}是这样一个子集,可挑选q1代表这个子集。在原来的自动机中,做:
a.凡导入到q2 ,…,qk的弧都改成导入q1
b.将q2 ,…,qk从原来的状态集S中删除
c.若I中含有原来的初态,则q1是新初态
d.若I中含有原来的终态,则q1是新终态]
到此,得到一个化简得DFAM’,使得n L( M )=L( M’)
本章知识点应用:
总结:本章知识较上一章深度大一些,不过通过上课老师讲例题和课后做题能把知识点一点点联系起来,理解更透彻一些。对于一些正规式的证明和状态转换图等,很容易联想到离散数学和数据结构的知识。通过做题,我意识到自己还是有一些不足,比如对于有限自动机的化简还是需要很长时间去思考和尝试,希望通过回顾总结,多次练习可以吃透,争取在短时间内可以做出题来。