為什麼要引入FOLLOW集的概念?

2021-09-01 11:53:15 字數 1229 閱讀 5769

#為什麼要引入follow集的概念?

考慮文法g[s]:

s→aas→aa

s→ds→d

a→basa→bas

a→εa→ε

求得各終結符和符號串的first集合如下:

first(s)=first(s)=

first(a)=first(a)=

first(aa)=first(aa)=

first(d)=first(d)=

first(bas)=first(bas)=

first(ε)=first(ε)=

若輸入串w=abd,則試圖推導出abd串的推導過程為s⇒aa⇒abas⇒abs⇒abds⇒aa⇒abas⇒abs⇒abd

從以上推導過程中可以看到,在第2步到第3步的推導中,即abas⇒absabas⇒abs時,因為當前面臨的輸入符號為d,但是最左非終結符a的產生式右部的開始符號集都不包含d,但有ε,因此對於d的匹配自然認為只能依賴於在可能的推導過程中a的後面的符號,所以這時候選用產生式a→εa→ε向下推導。而當前aa後面的符號為ss,ss產生式右部的開始符號集包含了dd,所以例子中可用s→ds→d推導得到匹配。

很顯然,我們從以上敘述中可以得出:

當某一非終結符的產生式中含有空產生式時,它的非空產生式右部的開始符號集兩兩不相交,並與在推導過程中緊跟該非終結符右部可能出現的終結符集也不相交,則仍可構造確定的自頂向下分析。因此,引入了乙個文法符號的後跟符號集合。

引入以下follow集的概念:

對a∈vna∈vn,有

follow(a)=follow(a)=

若s⟹∗⋅⋅⋅as⟹∗⋅⋅⋅a,則規定#∈follow(a)#∈follow(a)

這裡用#作為輸入串的結束符,也稱為輸入串括號。

因此對於每一文法符號 a∈vna∈vn,實際上求follow(a)follow(a)

就是考察a在產生式右端的出現情況,哪些終結符號可以跟隨在a後面?

使用下列規則,直至每個follow集不再增大為止:

s–>…a

那麼follow(a)等於#

因為將b用後面的代替後,原來b後面的符號也就是a後面的符號了

為什麼要引入補碼

現在我們知道了計算機可以有三種編碼方式表示乙個數.對於正數因為三種編碼方式的結果都相同,所以不需要過多解釋 原碼 1 0000 0001 反碼 1 0000 0001 補碼 1 0000 0001 為了解決原碼做減法的問題,出現了反碼 1 1 1 1 0000 0001 原 1000 0001 原 ...

為什麼要引入註解

使用annotation之前 甚至在使用之後 xml被廣泛的應用於描述元資料。不知何時開始一些應用開發人員和架構師發現xml的維護越來越糟糕了。他們希望使用一些和 緊耦合的東西,而不是像xml那樣和 是松耦合的 在某些情況下甚至是完全分離的 描述。如果你在google中搜尋 xml vs.annot...

為什麼要引入保護成員

在c 成員中我們需要一種成員比私有成員訪問範圍大比公有成員訪問範圍小的成員。因此就引入了保護成員。保護成員擴大範圍表現在基類的保護成員在派生類的成員函式中被訪問。基類的成員本身就是派生類的成員,但是出於隱藏目的不宜設為公有,但是又確實需要在派生類的成員函式中經常訪問基類成員,將其設定成保護成員,既能...