You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助推导给定上下文无关文法的FOLLOW集

推导上下文无关文法FOLLOW集的详细步骤

首先,咱们先明确计算FOLLOW集的核心规则,这是推导的基础:

  1. 文法的开始符号(这里是E)的FOLLOW集初始包含结束符$。
  2. 对于任意产生式A→αBβ(α、β是文法符号串,B是非终结符):
    • 如果β不能推导出ε,则FOLLOW(B)加入FIRST(β)中所有非ε的符号;
    • 如果β可以推导出ε,或者β本身就是ε,则FOLLOW(B)还要加入FOLLOW(A)的所有符号。

接下来针对你给出的文法:

E→TX
T→int Y | (E)
X→+E | ε
Y→*T | ε

咱们逐个推导每个非终结符的FOLLOW集:

1. 推导FOLLOW(E)

  • 作为开始符号,FOLLOW(E)初始有$。
  • 看产生式T→(E):这里E的后面直接跟着符号),根据规则,)要加入FOLLOW(E)。
  • 最终FOLLOW(E) = { $, ) },这和你已经得到的结果一致。

2. 推导FOLLOW(X)

  • 看产生式E→TX:X是E右部的最后一个符号,相当于β=ε的情况,所以FOLLOW(X)直接等于FOLLOW(E)。
  • 最终FOLLOW(X) = { $, ) },你这里的推导也是对的。

3. 推导FOLLOW(T)(解决你的核心困惑)

咱们找所有出现T的位置,逐个分析:

  • 位置1:E→TX
    这里T后面跟着X,先计算FIRST(X):X的产生式是X→+E | ε,所以FIRST(X) = { +, ε }。
    • 根据规则,先把FIRST(X)中除了ε的符号(也就是+)加入FOLLOW(T);
    • 因为X可以推导出ε,所以还要把FOLLOW(E)的所有符号($, ))加入FOLLOW(T)。
      到这里,FOLLOW(T)已经有{ +, $, ) }了。
  • 位置2:Y→*T
    这里T是Y右部的最后一个符号,相当于β=ε的情况,所以FOLLOW(T)需要加入FOLLOW(Y)。不过别急,咱们先看FOLLOW(Y)的推导。

4. 推导FOLLOW(Y)

找所有出现Y的位置:

  • 位置1:T→int Y
    这里Y是T右部的最后一个符号,所以FOLLOW(Y)直接等于FOLLOW(T)。
  • 位置2:Y→*T
    这里是Y自己的产生式,不影响FOLLOW(Y)的计算(FOLLOW集关注的是非终结符后面跟着的符号,而不是它右部的符号)。

现在结合FOLLOW(T)和FOLLOW(Y)的关系:
FOLLOW(Y) = FOLLOW(T),而咱们之前已经推导出FOLLOW(T)包含{ +, $, ) },所以FOLLOW(Y)也等于这个集合。

为什么会有follow(Y)=follow(T)和follow(T)=follow(Y)的循环?因为这两个非终结符的FOLLOW集是等价的,只要先通过E→TX推导出FOLLOW(T)的基础符号,就能打破这个循环,得到最终结果。

总结一下最终的FOLLOW集:

  • FOLLOW(E) = { $, ) }
  • FOLLOW(T) = FOLLOW(Y) = { +, $, ) }
  • FOLLOW(X) = { $, ) }

内容的提问来源于stack exchange,提问作者user2573189

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:48:27