求first集
first(a)就是从a可能推导出的所有开头终结符号或ξ.
三个例子掌握first集构造规则
1️⃣ X=a,则FIRST(X)={a}
X直接能推导出终结符号,终结符号加入FIRST集
2️⃣ X→aB|ξ,则FIRST={a,ξ}
X还能推导出ξ,把ξ也加入到FIRST集
3️⃣X→BCD B→a|ξ C→b|ξ D→c|ξ 则FIRST(X)={a,b,c,ξ}
X首先推出B,意味着B的FIRST集应该加入到X的FIRST集,但是由于B能推出ξ,所以X→BCD,可以变为X→CD,所以C的FIRST集应该加入到X的FIRST集,同理D也是
first集 实战题目
first集的核心做题简记:构造first集,我们要盯住生成式的左边,即什么产生了什么中前一个什么.
实战题目一
实战题目二
求follow集
follow(A)就是在所有句型中出现在紧接A之后出现的终结符号或#。
注意:follow集合中无ξ
三个例子掌握follow集构造规则
1️⃣ 对于文法的开始符号A,在它的follow集中加入‘#’
记忆即可
2️⃣ 形如B→aAβ的形式但β不是ξ,如A→aC B→bACe C→dB|ξ,follow(A)=First(Ce)={d,e}
看产生式的右部,出现A的地方,它后面跟着的一切非ξ符号都加入到First集合中,这个First集合就是follow(A),问题就转变成了求first集
简单理解为紧接的是不为空,求first集
3️⃣形如B→aA或B→aAβ的形式但β是ξ,A→aC B→bACe C→dB|ξ,则follow©=follow(A)Ue={d,e}
A后为空的时候,意味着,B产生A,B的follow集是A follow集的子集,故要取并集
简单理解为紧接的是为空,follow(B)加入follow(A)
follow集 实战题目
实战题目一
实战题目二
别把#号忘了,这个很重要