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

编译原理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小时内回复,谢谢。
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值