给出此文法每个非终结符的FIRST集和FOLLOW集: A→BAC|gDB|CC B→bCDE|ε C→DaB|ha D→dD|ε E→gAf|c
时间: 2023-10-24 17:07:17 浏览: 39
首先,我们需要计算出每个非终结符可以推导出的所有可能的首符号(FIRST集)。
对于A,它可以推导出BAC、gDB和CC,因此
FIRST(A) = {g, d, h}
对于B,它可以推导出bCDE或者ε,因此
FIRST(B) = {b, ε}
对于C,它可以推导出DaB或者ha,因此
FIRST(C) = {d, h}
对于D,它可以推导出dD或者ε,因此
FIRST(D) = {d, ε}
对于E,它可以推导出gAf或者c,因此
FIRST(E) = {g, c}
接下来,我们需要计算出每个非终结符可以跟随在其他符号后面的所有可能符号(FOLLOW集)。
对于A,它在开始符号的位置,因此$A$的FOLLOW集包含了输入串的结束标记$#$(假设#不在文法中)。另外,B在A的右边,因此当B出现在某个位置时,A的FOLLOW集也应该包括紧随B后面的符号。同样的,当C出现在位置中,A的FOLLOW集也应该包括C后面的符号。因此,
FOLLOW(A) = {#, b, h}
对于B,它只在A的右边出现,因此B的FOLLOW集只需要包含跟随在A后面的符号。因此,
FOLLOW(B) = {a, h, #}
对于C,它可以在A和D的右边出现,因此C的FOLLOW集应该包括紧随A和D后面的符号。因此,
FOLLOW(C) = {b, d, h, #}
对于D,它可以在C和E的右边出现,因此D的FOLLOW集应该包括紧随C和E后面的符号。因此,
FOLLOW(D) = {a, h, #}
对于E,它只在B的右边出现,因此E的FOLLOW集只需要包含跟随在B后面的符号。因此,
FOLLOW(E) = {d, h, #}