请求协助推导给定上下文无关文法的FOLLOW集
推导上下文无关文法FOLLOW集的详细步骤
首先,咱们先明确计算FOLLOW集的核心规则,这是推导的基础:
- 文法的开始符号(这里是
E)的FOLLOW集初始包含结束符$。 - 对于任意产生式
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)已经有{+,$,)}了。
- 根据规则,先把FIRST(X)中除了
- 位置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
相关产品推荐
相关产品推荐

