概念
词法分析阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)
题型
1:语言的正规式、正规文法
例:G[s]={ambn|m≥1,n≥1}
分析语言得到正规式:a(a)*(b)*b
正规文法:
S->AB
A->aA|a
B->bB|b
2:根据正规式画NFA(不确定有限自动机)
NFA M是一个五元组,M=(S,Σ,δ,S0,F) S:状态集合 Σ:字母表 S0 :非空初始状态集, S0∈S F:终止状态集,F∈S δ:状态转换函数,δ:S×Σ*→LS的映射 δ(S,a)={S1,S2,……,Sn}
上例:
正规式 : a(a) * (b)*b
NFA:
3:DFA(确定有限自动机)
DFA是一个五元组,M=(S,Σ,δ,S0,F) S:状态集合 Σ:有穷字母表 S0:初始状态, S0∈S F:终止状态,FS δ:状态转换函数,δ:S×Σ→S的映射且为单射 δ(S,a)=S’:当前状态为S,输入符号a,经状态转换函数转向状态S’
DFA M含有m个状态,n个输入字符,则状态转换图有m个结点,每个结点至多有n条箭弧射出,每条箭弧用Σ中一个不同的输入字符做标记
DFA 初始状态唯一,后继状态唯一
例:DFA M=(S,Σ,δ,S0,F)=({S,U,V,Q},{a,b},δ,S,{Q})
δ(S,a)=U δ(S,b)=V δ(V,a)=U δ(Q,a)=Q
δ(U,a)=Q δ(U,b)=V δ(V,b)=Q δ(Q,b)=Q
4:NFA确定化:DFA—子集法
算法:NFA=(S,Σ,f,S0,F)→DFA=(S’,Σ,δ,I0,F’)
例:一个NFA为下图
(1)求Ii=ε-closure(Si)
// ε-closure(I)
(a)若q∈I,则q∈ε-closure(I);
(b)若q∈I ,那么从q出发经任意条ε弧而能到达的任何状态q’∈ε-closure(I)
//状态i输入为ε能够转变为哪些状态
//第一个是开始状态,输入为ε能够转变为{5,1}再加上本身{X,5,1},并设该状态为T0
I0=ε-closure({X})={X,5,1}=T0
I1=ε-closure({5})={5,1}
I2=ε-closure({1})={1}
I3=ε-closure({3})={3}
I4=ε-closure({4})={4}
I5=ε-closure({2})={2,6,Y}
I6=ε-closure({6})={6,Y}
I7=ε-closure({Y})={Y}
(2)求It=ε-closure(Move([S1,S2,…,Sj],a|b))
//即将上面标记的初始状态T0输入a或b符号能够到达的状态,如果该状态没有标记过,就标记为新的状态,并不断重复这个操作
T0:
Ia=ε-closure(Move(T0,a))=ε-closure({5,3})={5,3,1}=T1
Ib=ε-closure(Move(T0,b))=ε-closure({5,4})={5,4,1}=T2
标记T1:
ε-closure(Move(T1,a))=ε-closure({5,2,3})={5,2,3,1,6,Y}=T3
ε-closure(Move(T1,b))=ε-closure({5,4})={5,4,1}=T2
标记T2:
ε-closure(Move(T2,a))=ε-closure({5,3})={5,3,1}=T1
ε-closure(Move(T2,b))=ε-closure({5,2,4})={5,2,4,1,6,Y}=T4
标记T3:
ε-closure(Move(T3,a))=ε-closure({5,2,3,6})={5,2,3,1,6,Y}=T3
ε-closure(Move(T3,b))=ε-closure({5,4,6})={5,4,6,1,Y}=T5
标记T4:
ε-closure(Move(T4,a))=ε-closure({5,3,6})={5,3,1,6,Y}=T6
ε-closure(Move(T4,b))=ε-closure({5,2,4,6})={5,2,4,6,1,Y}=T4
标记T5:
ε-closure(Move(T5,a))={5,3,1,6,Y}=T6
ε-closure(Move(T5,b))={5,2,4,6,1,Y}=T4
标记T6:
ε-closure(Move(T6,a))={5,3,1,2,6,Y}=T3
ε-closure(Move(T6,b))={5,4,6,1,Y}=T5
最终可以得到状态转化矩阵:
即可以确定化NFA,得到DFA:
5:DFA的化简–分割法:
1.把DFA状态分割成两个状态S1’(终止状态集)和S2’(非终止状态集)。
2.对每个状态集按下述方法进行分割:
设第i次分割把集合分割成S=S1(i)∪S2(i)∪…∪Sk(i),检查状态集Sj(i)(j=1,2,…k)设Sj’和Sj’’ ∈ Sj(i),δ(Sj’,a)= Sm ,δ(Sj’’,a)= Sn
若Sm,Sn处于同一集合中,则放在同一集;
若Sm,Sn不处于同一集合中,则放在两个集。
3.重复2直至不产生新的分割为止
4.合并等价状态:在状态集中选一代表其它删除。如I={q1,q2, …, qk}不可再分,则可选择q1代表这个子集,凡导入到q2, …, qk的弧都改成导入到q1,若I中含有原来的初态,则q1是新的初态,若I中含有原来的终态,则q1是新的终态。
原理就是将不同集的状态分开直到不能分
上例:以1代表T1等
终态S1={3,4,5,6}
非终态S2={0,1,2}
(1)先分割终态
S1输入a:{3,4,5,6}a会转变为{3,6},在一个集合内
S1输入b:{3,4,5,6}b会转变为{4,5},在一个集合内
所以终态不可分,将整个终态当做一个状态
(2)分割非终态
S2输入a:{0,1,2}a会转变为{1,3},不在集合内,δ(1,a)=3
就将1分离S2集,此时状态集合为{0,2},{1},{3,4,5,6}
(3)再判断{0,2}是否可分割
{0,2}a={1},在一个集合内
{0,2}b={2},在一个集合内
所以{0,2}集合不可分割
所以最终状态集为{0,2},{1},{3,4,5,6}
画出简化后的DFA:
6:等价关系
正规文法与有限自动机的等价性
- 右线性文法 -->FA
例:
S→aS|aA|bB|ε
A→bA|b
B→cB|cC|c
C→d
其等价的自动机:
Q={S,A,B,C,T}
Σ={a,b,c,d}
q0=S
F={ T }
- FA -->右线性文法
已知DFA M=(S, Σ,δ,S0,F)
1.若S0 不属于 F,令GR=(Σ,S,S0,Р),Р的产生式有:
若有δ(Ai,a)=Aj,则:
(a)若Aj∈F,则引入规则Ai→a|aAj
(b)若Aj不属于F,则引入规则Ai→aAj
2.若S0∈F,则引入S0’,且S0’→S0| ε,且S0’替代S0为文法起始符。
- 左线性文法–>FA
例:
S→Sa|Aa|ε
A→Ab|Bc|b
B→Bc|c
正规式与有限自动机的等价性
- FA–>正规式
有限自动机:
得到正规式:(a|b) * ( aa|bb)(a|b) *
- 正规式–>FA
正规式:(a|b)*abb
FA:
当然也可以这样: