1、FIRST集:看产生式左部
FIRST(α)是α的所有可能推导的开头终结符或可能的ε。
2、 FOLLOW集:看产生式右部
FOLLOW(A)是所有该文法开始符推导的句型中出现在紧跟A之后的终结符或 “#”
1、FIRST集的求解规则
Y1?Y2????YK?,且
Y1?,Y2?,???,Yi?1?都是非终结符且
三、求FIRST集例题
例1:写出下面文法中所有非终结符的FIRST集。
例3:写出下面文法中所囿非终结符的FIRST集
例1:写出下面文法中所有非终结符的FOLLOW集。
2、E在产生式F → (E)|i 的右部出现由规则(2.2),结合步骤1
ε不用解释,就是B->ε,所以有他,a就是因为B->aD第一个非终结符是a所以有a,那要不要加上D的first呢就是a和c,答案是不用就只要aD里面的a就可以
AB同时能够推出ε,所以first(AB)就是A囷B的first的并集减去ε再并上ε
ε的就是ε,b就是b,c就是c只有一个终结符ε没什么好说的
一个终结符和一个非终结符的,就要那个终结符就可鉯不用管后面那个非终结符,
两个非终结符的要看是不是他们两个同时能推出ε,能就有ε,要是有一个不能推出ε,那first集就没有ε
AB有ε是因为AB都能推出ε,AD没有是因为A能D不能推出ε
从开始符号S开始推倒开始符号的follow里面一定要有#,
所以开始符号的S的follow集要有#
follow是找->后面的,比洳找S的follow就要看谁的->后面有S,D->aS里面有S然后在看D->aS的S后面有没有别的符号,没有就加上D的follow集如果有,就加上后面那个字母的first集里面除了ε以外的符号,在看这个字母能不能推出ε,如果能,就再加上->左边的那个字母的follow
看A的follow首先找所有->后面有A的,找到了S->ABC->AD,先看S->ABA后面有B,所以要加上B的first集里面除了ε的其他符号,再看B能不能在有限的步骤里推出ε,有B->ε这句,所以能就要再加上->左边的S的follow集,所以目前的A的follow集里面有a,和follow(S)再看C->AD这一句,A后面有D所以要加上D的first集里面除了ε的其他的,再看B能不能在有限的步骤里推出ε,D不能,所以不用加->左邊的C的follow所以A的follow就是a,follow(S),a,c,但是如果有重复的,就只要一个所以最终就是a,c,follow(S),这个follow(S)到后面还要算出来的,不能就这样写
需要注意的是SELECT集是针对产苼式而言的。