编译原理LL(1)文法的判断(first集、follow集和select集)
1、问
- 如何通过给定的文法,判断该文法是否是LL(1)文法?
2、答
- 求出该文法的first集、follow集和select集,通过select集之间的关系进行判断
3、集合
3.1 first集
- B->abS first(B)={a}
- B->AS
- 若A(A可0步或多步得出A->ε),first(B)={first(A)-{ε}}∪first(S)
- 若A(A不可0步或多步得出A->ε),first(B)=first(A)
- 若A满足,S也满足,即A和S均可0步或多步得出->ε,则first(B)={first(A)-{ε}}∪{first(S)-{ε}}∪{ε}
- 反复使用上述2步,直到每个符号的first集不再增大为止
同理由一个符号的first集可得出符号串的first集
3.2 follow集合
- 对起始符,follow集加入{#}
- 对A->aBbc,follow(B)={b}
- 对A->aBD,
若D(D不可0步或多步得出D->ε) ,follow(B)=first(D)
若D(D可0步或多步得出D->ε) ,follow(B)=follow(A) - 反复使用上述步骤,直到每个符号的follow集不再增大为止
3.3 select集合
select集是对每个产生式进行处理
- select(S->ab)=first(a)
- select(S->AB)
若AB均可 0步或多步得出->ε,则select(S->AB)={first(AB)-{ε}}∪follow(S)
反之,select(S->AB)=first(AB) - 采用上述步骤,直到获得所有产生式的select集
3.4 LL(1)文法判断
由上步的select集,然后对相同的左部进行交集判断,若所有的交集均为空,则表示该文法是LL(1)文法
若有一类非终结符不满足条件,则都不可称之为LL(1)文法
4、例
文法G[S]:
S→AaS|BbS|d
A→a
B→ε|e
- first集:
first(S)=first(AaS)∪first(BbS)∪{d}
=first(A)∪{first(B)-{ε})∪first(b)∪{d}
={a,e,b,d}
first(A)={a}
first(B)={e,ε}
first(AaS)=first(A)={a}
first(BbS)={first(B)-{ε}}∪first(b)={e,b}
first(d)=first(d)={d}
first(a)=first(a)={a}
first(ε)=first(ε)={ε}
first(e)=first(e)={e} - follow集:
follow(S)=follow(S)∪follow(S)∪{#}={#}
follow(A)=first(a)={a}
follow(B)=first(b)={b} - select集:
select(S->AaS)=first(A)={a}
select(S->BbS)={first(B)-{ε}}∪first(b)={e,b}
select(S->d)=first(d)={d}
select(A->a)=first(a)={a}
select(B->ε)=first(ε)={ε}
select(B->e)=first(e)={e} - 判断
select(S->AaS)∩select(S->BbS)∩select(S->d)=Ø
select(B->ε)∩select(B->e)=Ø
因此称之为LL(1)文法
如有任何问题请留言,24小时内回复,谢谢。