說明:
所有大寫字母代表非終結符,小寫字母代表終結符,省略號代表未知數目(可能為0)的不確定類型的文法符號。
First集合:
First集合顧名思義就是求一個文法符號串所可能推導出的符號串的第一個終結符的集合。
First(X)就是求X所有推導出的符號串的第一個符號的集合。
求First集合可分如下幾種情況:
單個符號的First集合:
單個終結符的First集合就是它自己。
單個非終結符的First集合:
A-->a… 產生式右部以終結符開頭
根據定義,這種情況下顯然可以看出a屬於First(A)。
A-->B… 產生式右部以非終結符開頭
根據定義,既然可以把A替換成B……,也可以看出First(B)屬於First(A)。
這是一個遞歸的推導。
多個符號形成的符號串的First結合:
符號串ABC…,並且A不能推導出空串ε
當A不能推導出空串ε,顯然根據定義First(ABC…)=First(A)
符號串ABC…,並且A可能推導出空串ε
當A不是空串的時候,顯然First(A)屬於First(ABC…),但當A是空串的時候,
ABC…就成了BC…,此時根據B是否能推出空串來決定是否將First(B)加入First(ABC…)。這是一個遞歸的推導,綜上所述,符號串中的第一個不能推出空串的符 號前面所有符號的First集合減去空串ε都屬於First(ABC…),第一個不能推出空串的 符號的First集合也屬於First(ABC…)。也就是假設A、B都可以推出空串,C不能推 出空串,First(ABC…)=First(A)-ε∪First(B)-ε∪First(C)。
符號串ABC…,並且所有的符號ABC…都可能推導出空串ε
此時First(ABC…)就是所有符號的First集合的並集
注意:First集合中的符號一定是終結符,終結符也包括空串ε。
Follow集合:
Follow集合也是顧名思義的,就是文法符號后面可能跟隨的終結符的集合(不包括空 串ε)。
Follow(X)就是求X后面可能跟隨的符號集合。
求Follow集合可分如下幾種情況:
終結符的Follow集合沒有定義,只有非終結符才會有Follow集合。
A-->…Ua… 要求的Follow集合的非終結符后跟終結符
根據定義,顯然a屬於Follow(U)。這種情況下,Follow(U)和A沒有任何關系,產 生式左邊是什么無所謂。
A-->…UP… 要求的Follow集合的非終結符后跟非終結符
根據定義,顯然P的第一個符號屬於Follow(U),也就是First(P)屬於Follow(U)。
A-->…UP並且ε屬於First(P) 要求的Follow集合的非終結符后跟非結尾的終結符, 並且結尾非終結符的First集合包含空串。
這是上一種情況的一種特例,除了要按上一種情況處理,First(P)屬於Follow(U) 以外還要進行分析;因為當P推導為空串時,空串不能出現在Follow集合中,所以U后面跟隨的應該是P后面的東西,可P已經是結束的符號,此時U后面顯然就是A后 面跟隨的東西了。所以在這種情況下Follow(A)也屬於Follow(U)。
A-->…U 要求的Follow集合的非終結符在產生式結尾
這時候又要遞歸推導,U是A的結尾,所以U后面跟隨的東西也就是A后面跟隨的東 西。所以Follow(A)屬於Follow(U)。
注意:Follow集合中的符號一定是終結符,並且不能包括空串ε,而且定義開始符號 的Follow集合初始為{#(句子括號)}。
Select集合:
Select集合就是產生式左部的可能的推導結果的起始符號。
Select(A-->B)就是求這個產生式中A可能推導出起始符號集合(不包含空串ε)。
求Select集合可分如下幾種情況:
A-->X (X為任意文法符號串,不限於非終結符或單個符號),並且X不能推導出空串ε
根據定義,顯然A推出的符號串起始就是X的起始,也就是First(X).
Select(A-->X)= First(X)
A-->X (X為任意文法符號串,不限於非終結符或單個符號),並且X能推導出空串ε
根據定義,顯然First(X)屬於Select(A-->X),此外,當X推導為空串時,顯然A也推導為空串,那么此時推導出的符號串就會是A后面的符號的推導結果。也就是Follow(A),所以,此時Follow(A)也屬於Select(A-->X)。
注意:Select集合中不包括空串ε,但有可能會包含#(句子括號)。
轉自:http://m.blog.csdn.net/blog/bjrxyz/9261243
