補充:
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)文法

