First集、Follow集

构建First集

  • 求First集步骤

首先,对所有非终结符A, 先设定FIRST(A)= {} (空)
FIRST(A) = { t | A → tw },t为终结符,w为任意类型
然后, 对每一个产生式A → Bw, B为终结符,循环以下步骤(递归)

  • FIRST(A) = FIRST(A) ∪FIRST(B)
  • 当FIRST 集合不再发生变化时,算法终止.
  • 产生式如下

E → TE’
E’ → +TE’ | ε
T → FT’
T’ → *FT’ | ε
F → (E) | id

  • 求First集详细步骤:
  • 第一步填表:
EE’TT’F
First(T)+First(F)*(
εεid
  • 开始递归填表:
EE’TT’F
+*(
idεidεid

  • 插入一个注意事项

  • 在这里插入图片描述

  • 若是如下产生式:

  • 在这里插入图片描述

  • 注意到A → Da因为D能产生ε,所以First(Da) = {b,a}

  • 所以First(A) = {ε,a,b}

  • 同理可得First表格

  • 在这里插入图片描述


构建Follow集

  • 求Follow集步骤
    在这里插入图片描述

  • 产生式如下

(1)E → TE’
(2)E’ → +TE’ | ε
(3)T → FT’
(4)T’ → *FT’ | ε
(5)F → (E) | id

  • 上面求得的First表如下:

  • EE’TT’F
    +*(
    idεidεid
  • 求Follow集步骤

    • Follow(E)= {$}(结束符)

    • (1)E → TE'可以看成:E → εTE'E → TE'ε

    • E → εTE'可分析:

      • Follow(T)= First(E’)- {ε},又因为ε属于First(E’),所以Follow(T)并入Follow(E);
    • E → TE'ε可分析:

      • First(ε) = {ε}
      • Follow(E‘) = First(ε) - {ε} = {}(空集),又因为ε属于First(ε),所以Follow(E’)并入Follow(E)
    • 第一次填表得:

    • EE’TT’F
      $Follow(E)First(E’)- {ε}
      Follow(E)
    • (2)E' → +TE' | ε可以看成E' → +TE'E' → +TE'ε

    • E' → +TE'分析得:

      • 只能求得Follow(T) = First(E’)- {ε},又因为ε属于First(E’),所以Follow(T)并入Follow(E’)
    • E' → +TE'ε分析得:

      • Follow(E’) = First(ε) - {ε} = {}(空集),又因为ε属于First(ε),所以Follow(E’)并入Follow(E’),相当于没有
      • 注:递归自己直接不填表,不然程序陷入死递归。
    • 第二次填表得:

    • 注:重复的不写

    • EE’TT’F
      $Follow(E)First(E’)- {ε}
      Follow(E)
      Follow(E’)
    • 后面分析省略,只写出填表步骤,每次分析一条产生式填一次表:

    • 分析(3)T → FT',第三次填表:

    • EE’TT’F
      $Follow(E)First(E’)- {ε}Follow(T)First(T’) - {ε}
      Follow(E)Follow(T)
      Follow(E’)
    • 分析(4)T' → *FT' | ε,第四次填表:

    • EE’TT’F
      $Follow(E)First(E’)- {ε}Follow(T)First(T’) - {ε}
      Follow(E)Follow(T)
      Follow(E’)Follow(T’)
    • 分析(5)F → (E) | id,第五次填表:

    • EE’TT’F
      $Follow(E)First(E’)- {ε}Follow(T)First(T’) - {ε}
      )Follow(E)Follow(T)
      Follow(E’)Follow(T’)
    • 开始递归,最后完成表格:

    • 首先引用First

    • EE’TT’F
      +*(
      idεidεid

    • 递归调表Follow表结果

    • EE’TT’F
      $)++*
      )$))+
      $$)
      $
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeEggs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值