补充:
FIRST集里面可以有,但是不能有$
FOLLOW集里面可以有$,但是不能有
下面通过一个例子,来展示具体问题分析方法:
当计算上面文法的first集合的时候,
第一步,先把所有符号first集写下:
第二步,分析每一个文法,将分析结果写入first集合
例如第一个文法,可以得出first(E)集合中,需要包括first(T)中的所有元素,此时first(T)中为空,此时不进行操作
再看第二个文法,可以得出first(E`)集合包括+和,所以把这两个符号,写入对应first集合
以此类推
第三步,循环第二步操作,把对应结果再次分析,直到循环整轮没有新的元素添加进集合中为止
最后是结果:
下面进行计算follow集实战:
第一步,先把所有元素的follow集合写好:
第二步,将终结符$放在开始的follow集合中
第三步,开始进行每一行文法的分析
分析第一行:可以看出T的follow集合等于E`的first集合,E`的first集合包括+和,这里的话,把+放进T的follow集合中,但是因为
follow集合中没有,所以可以得出结论,E`为空时,T的follow集合和E的follow集合是一样的,需要吧元素移过去,以此类推
第四步:重复上面操作,直到没有新元素添加进集合
最后是结果:
下面展示select集合的求法:
1:遇见非终结符,select集合为非终结符的first集合
2:遇见终结符,直接写进集合
3:当遇到空串,为前面元素的follow集合
First(A)集的作用是标示在替换非终结符A的时候,替换后的文法的首字母集合,语法分析程序根据这个来判断给定的语言是否是合法的,是符合规则的。
Follow(A)的作用是标示那些可以出现在A之后的字符,语法分析程序根据这个,在A可以被替换为e(空)的时候来进行判断,看当前的文法是否是合法的。
这里简单说明下,比如A->b,A->e(空) 当给定的语言是 bXXXXX的时候,根据第一句文法就可以判定句子合法,但是如果给的语言是cXXXXX的时候,因为A->可以替换为空,这时候就需要一句A的follow集来进行判断,若A的follow集里面含有c 则语言是合法的
Select集的作用是将first集和follow集进行合并,如果两个文法的左端都是A,若他们的select集交集为空,表明他们是两个无关的,不会产生不确定性的文法,反之,则表明文法不是LL(1)文法