1. 程式人生 > >FIRST集合、FOLLOW集合、SELECT集合以及預測分析表地構造

FIRST集合、FOLLOW集合、SELECT集合以及預測分析表地構造

FIRST集合、FOLLOW集合、SELECT集合以及預測分析表地構造

FIRST集合的簡單理解就是推匯出的字串的開頭終結符的集合。

FOLLOW集合簡單的理解就對於非終結符後面接的第一個終結符。

 

給定一個由終結符和非終結符組成的字串,FIRST(

FIRST(

FOLLOW(X)是可直接跟隨與X之後的終結符集合。也就是說,如果存在著任一推導包含Xt,則t∈FOLLOW(X)。當推導包含XYZt,其中Y和Z都推匯出時,也有t∈FOLLOW(X)

 

FIRST、FOLLOW和nullable的迭代計算

計算FIRST、FOLLOW和nullable的演算法

將所有的FIRST喝FOLLOW初始為空集合,將所有的nullable初始為false

for 每一個終結符Z

    FIRST[Z]←{Z}

repeat

    for 每個產生式X→

        for 每個i從1到k,每個j從i+1到k。

            if 所有都可為空的

                then nullable[x] ←true

            if 都是可為空的

                then FIRST[X] ←FIRST[x]∪FIRST[]

            if 都是可為空的

                then FOLLOW[] ←FOLLOW[]∪FOLLOW[X]

            if 都是可為空的

                then FOLLOW [] ←FOLLOW[]∪FIRST[]

until FIRST、FOLLOW和nullable在此輪迭代中沒有改變

 

例子如下

第一輪迭代如下

 

 

構造一個預測分析器

考慮一個遞迴下降分析器。費終結符X的分析函式對X的每個產生式都有一個子句,因此,該函式必須根據下一個輸入單詞T來選擇其中的一個子句。如果能夠為每一個(X,T)選擇出正確的產生式,我們就能夠寫出這個遞迴下降分析器。我們需要的所有資訊可以用一張關於產生式的二維表來表示,此表以文法的非終結符X和終結符T作為索引。這張表稱為預測分析表(predictive parsing table)。預測分析表可以由Select集合構造

 

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)。