编译原理 词法分析题型

概念

词法分析阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)

题型

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:

ε
a
a
b
b
ε
X
1
2
3
Y
3:DFA(确定有限自动机)
DFA是一个五元组,M=(S,Σ,δ,S0,F)
S:状态集合
Σ:有穷字母表
S0:初始状态, S0∈S
F:终止状态,FS
δ:状态转换函数,δ: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:

a
b
a
b
0,2
1
3,4,5,6
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:
在这里插入图片描述
当然也可以这样:
在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值