编译原理LL(1)文法的判断(first集、follow集和select集)

1、问

  • 如何通过给定的文法,判断该文法是否是LL(1)文法?

2、答

  • 求出该文法的first集、follow集和select集,通过select集之间的关系进行判断

3、集合

3.1 first集
  1. B->abS first(B)={a}
  2. 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)-{ε}}∪{ε}
  1. 反复使用上述2步,直到每个符号的first集不再增大为止

同理由一个符号的first集可得出符号串的first集

3.2 follow集合
  1. 对起始符,follow集加入{#}
  2. 对A->aBbc,follow(B)={b}
  3. 对A->aBD,
    若D(D不可0步或多步得出D->ε) ,follow(B)=first(D)
    若D(D可0步或多步得出D->ε) ,follow(B)=follow(A)
  4. 反复使用上述步骤,直到每个符号的follow集不再增大为止
3.3 select集合

select集是对每个产生式进行处理

  1. select(S->ab)=first(a)
  2. select(S->AB)
    若AB均可 0步或多步得出->ε,则select(S->AB)={first(AB)-{ε}}∪follow(S)
    反之,select(S->AB)=first(AB)
  3. 采用上述步骤,直到获得所有产生式的select集
3.4 LL(1)文法判断

由上步的select集,然后对相同的左部进行交集判断,若所有的交集均为空,则表示该文法是LL(1)文法
若有一类非终结符不满足条件,则都不可称之为LL(1)文法

4、例

文法G[S]:
S→AaS|BbS|d
A→a
B→ε|e

  1. 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}
  2. follow集:
    follow(S)=follow(S)∪follow(S)∪{#}={#}
    follow(A)=first(a)={a}
    follow(B)=first(b)={b}
  3. 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}
  4. 判断
    select(S->AaS)∩select(S->BbS)∩select(S->d)=Ø
    select(B->ε)∩select(B->e)=Ø
    因此称之为LL(1)文法

如有任何问题请留言,24小时内回复,谢谢。
在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐