词法分析
- 在单词的级别上分析和翻译源程序,需要将单词翻译成(类号,内码)的二元表达 式,用于后序的语法分析
理论基础
- 有限自动机理论
- 有限自动机与正规文法,正规式之间在描述语言方面有一一对应关系
- 正规文法:A->αB,A->α,或者A->Bα,其中A,B∈VN,α∈VT*,其中当A->αB或者A->α为右线性文法,A->Bα或者A->α为左线性文法
正规文法和有限自动机
正规文法,3型文法
- 正规文法是描述正规集的文法,用于描述程序语言的语法部分
- 符合正规文法的语言的集合就是正规集
正规文法,正规集和正规式之间的关系
-
正规式:
- 设A是非空字母表,A={ai | i=1,2,3,……n},则ε,空集和ai(i=1,2,3,4……)都是正规式
- 若α,β都是正规式,则,α|β,α·β,α *,β * α+,β +都是正规式
- 正规式只能有限使用上面规则得到的
- |读作或者可以写成"+“或者”," ,· 读作连接
- 只能由A集合上的正规式α组成的语言称为正规集,记作L(α)
- 利用正规集相同,可以用来证明相应正规式等价
- 正规式,正规文法和正规集之间的关系
- 一个正规集可以使用正规文法或者正规式来定义,对于任意一个正规文法,都有一个定义同一语言的正规式;同样,对于每一个正规式,存在生成同一语言的正规文法;有些正规集很容易用文法定义,有些则用正规式更容易;两者之间可以相互转化
- 可以使用正规语言来反推定义正规式
- 例子:
- 证明b(ab) *=(ba) *b
- 思路:只需要写出正规集,当它们正规集相同就可以证明它们相等
- L(b(ab)*)={b,bab,baba,……};L((ba) *b)={b,bab,babab},其中的b由 * 闭包所得
- 正规式等价关系
这个公式可以理解为:这两个等式可以相互转化,L(α->β|αγ)={β,βγ,βγγ,βγγγ……}因为α是非终结符,所以L(α->β|αγ)的语言的首字符一定是β,而L(βγ*)的正规集也是这种语言,所以它们相等
-
正规文法和正规式的相应转化
- 由正规文法G的各个产生式写出对应正规方程式,得到联立方程组
- 将方程组的非终结符作为变元
- 对正规方程组的解,得到关于开始符号S的解:S=w,w∈VT *,w就是所求的正规式
- 例子:
可以通过上面所给出的转化关系得到
有限自动机
- 一种识别装置,可以准确的识别正规集。为词法分析程序的构造提供了方法和工具
- 在自动机内部有若干个状态,系统根据当前的状态和面临的输入字符来决定系统的后继行为
- 状态分为初始状态,中间状态和结束状态,终止状态和中间状态可以有多个,但是初始状态只有一个
- 例子:
其中的双圈符号表示终止状态,表示自动机可以在这个状态下退出 - 确定自动机(DFA):
- 确定自动机是一个五元式M(S,∑,f,s0,Z)
- S是所有状态的集合;∑有限字母表集合;f是映射关系Sx∑->S,表现为f(s,a)=s’;s0是唯一的初态;Z终止状态集Z是S的真子集,其中的x可以看着读入符号。
- 状态转换关系表示
- 状态转换矩阵
- 状态转换图
上图我们可以看到一个有限自动机状态集为{0,1,2,3},有限字符集{a,b},映射函数集f,初始状态0,终止状态3
当初始状态为为终止状态,表示该自动机可以识别空串
对最后一句话的描述:当初始状态s0识别一串字符串α经过若干步到达终止状态,这个过程就是对这个字符串α识别成功
- 不确定自动机:当遇到一个读入自动机可以转变为若干个不同结果
- 定义:不确定的有限自动机是五元组{S,∑,f,S0,Z}和确定自动机一样
- 存在任何一个确定有限自动机,存在一个不确定有限自动机等价,反之亦然
- 如何判断自动机等价:只需要识别语言相同,则两个自动机等价
- 可以使用NFA确定化算法来判断
- NFA确定性
-
定理:对于一个NFA M,存在一个DFA M’,使L(M)=L(M’)。即L是NFA接收的正规集,则存在一个DFA接收L
-
算法:
-
例题:
这一题中:对于NFA M进行确定化,首先,将M的初始态q0作为DFA的初始态I0,然后通过这个初始态去延展;
通过图上的关系得到了I0可以通过读入0到达本身,所以不用进行新状态的添加,然后I0可以通过读入1进入一个新的状态,这个因为这个新状态在DFA的状态集中未出现,所以添加新状态I1;
在以I1为基础,I1={q1},通过读入0可以到达两个状态,即状态{q1,q0},这个状态不输入DFA的任意状态,使用一个新的符号表示I2={q1,q0},同时q1通过读入1到达q0,{q0}属于DFA状态中的I0,所以不用加入,故得出答案
-
- 确定有限自动机化简:
-
化简条件:接收语言必须相同
-
划分法:
- 将DFA M中的状态划分为互不相交的子集,每个子集内部的状态都等价,而在不同子集间的状态均不等价
- 每个子集选出一个代表,消去他们的等价状态
- 原来摄入其他等价状态的弧改为摄入相应的代表状态
-
状态的等价:
-
化简算法:
解答:当从m个子集中,任取一个,这个子集中的所有元素读入元素a得到的元素需要在同一个子集中 -
例子:
解释:
首先将M的状态分为两部分,终态集{0,1,2}和非终态集{3,4,5,6},将他们加入化简后的M的状态集S中
首先看终态集{0,1,2},这三个状态通过读入a可以到达{1,3}状态,不属于S,所以状态集{0,1,2}要分开,变成{0,2}和{1},因为{0,2}通过读入a可以到达相同的状态{1}中,S={{0,2},{1},{3,4,5,6}};{0,2}通过读入状态b到达的状态为{2,3}不属于S中,所以也要分开S={{0},{1},{2},{3,4,5,6}}
再看终态集{3,4,5,6},通过读入a到达了{3,6},属于{3,4,5,6};通过读入b到达{4,5},属于,不划分;
S={{0},{1},{2},{3,4,5,6}},通过映射关系画图
-
正规式和有限自动机的关系
-
关系定理
-
有限自动机M向正规式α的转化
当自动机通过初始状态通过是被一个字符串就可以到达终态这个字符串就是该自动机的正规式 -
例子
添加x,y状态,0状态可以通过读入10到达1,3可以通过读入01到达0,同时还要考虑,当0或1读入11,当3或1读入00的情况 -
正规式到自动机的转化
因为由*闭包的存在,所以在正规式转化为自动机的过程中,会产生空串,而对于含空串的非确定有限自动机在确定化时,需要使用其他的方法。
-
对含有空串的NFA进行确定化
解释:
将NFA的初始状态求e闭包加入DFA的初始状态集,求e闭包也就是NFA初始状态可以通过空串的到达的状态,由初始状态和这些空串到达状态组成的集合就是DFA的初始状态。
对于DFA中的状态集,每一个需要对其进行非空串有限自动机确定化的第二步,将这个状态通过读入一个字符a,可以到达的状态加入同一个集合,再对这个集合求e闭包,当求完e闭包后,得到的集合不属于Q中,就将它加入Q中 -
例子
正规文法和有限自动机
- 设G=(VN,VT,P,S)是正规文法,则存在一个有限自动机M(Q,∑,f,q0,Z)使得L(G)=L(M)。
- 对于一个正规文法,可以是左线性文法或右线性文法,但是对于一个有限自动机M,都存在一个右线性文法Gr和左线性文法Gl,使得L(M)=L(Gr)=L(Gl)
- 将右线性文法转化为等价自动机
- 右线性文法G=(VN,VT,P,S),将其转化为自动机M(Q,∑,f,q0,Z)
- 将VN中的每个非终结符视为状态符号,并增加一个新的终结状态T,即令Q=VN∪{T};同时,令∑=VT,q0=S;若P中有S->ε,则令Z={S,T},否则令Z={T};S->ε表名该自动机可以接收空串,也就是说初始状态为终止状态。
- P中产生式用如下映射f来代替:
- 对于P中每一条形如A1->aA2的产生式,在M中设为f(A1,a)=A2
- 对于P中每一条A1->a的产生式,在M中设为f(A1,a)=T
- 对于∑上的所有a,取f(T,a)=空集,即在终态下有限自动机无动作
- 例题
- 有限自动机向右线性文法转化
- 例题:
- 例题:
- 左线性文法转化为有限自动机
由于左线性文法的特殊性,可以看到这个例子中,文法识别的语言是(b+)a,所以构造自动机时,需要反过来。其中当S可以识别空串,那么在开始状态可以直接到达状态,所以将开始状态加入终态集中