編譯原理: FIRST(x) FOLLOW(x) SELECT(x)的計算

Zeker62發表於2021-10-09

已知文法G[S]:
           S→MH|a
           H→LSo|ε
           K→dML|ε
           L→eHf
           M→K|bLM
判斷G是否是LL(1)文法。 

First計算

First集合的定義就是某個非終結符表示式可以推匯出來的第一個字元可以是什麼
比如表示式S --> abb,它的First(S)={a}

First(S)={a}+First(M)+First(H)+{ε}={a,b,d,e,ε}
# S表示式存在單個的終結符a,新增{a}
# S表示式以M開頭,新增First(M)
# 根據後面的表示式判斷,M可以推出K,K可以推出空,所以M可以為空,此時S以H開頭,新增First(H)
# 由於H也可以推出空,所以S最終也會指向空,新增 空集
First(M)={b}+First(K)+{ε}={b,d,ε}
# M表示式以終結符b開頭,新增{b}
# M表示式可以推匯出單個的K表示式,所以新增First(K)
# K有可能推匯出空集,即M可以推匯出空,所以新增 空集
First(K)={d}+{ε}={d,ε}
# K可以以終結符d開頭,新增{d}
# K可以推匯出空,新增空集
First(H)=First(L)+{ε}={e,ε}
# H可以推匯出以L開頭的表示式,所以新增First(L)
# H可以推匯出空,所以新增空集
First(L)={e}
# L只能推匯出一個表示式,並且開頭是終結符,所以新增{e}

## 最後將已知的表示式代入到未知的表示式當中去,即可求出全部First集合

Follow計算

Follow表示某個非終結符後面可以跟著什麼樣的字元
Follow集不存在空集
為表示式編號

1: S→MH|a
2: H→LSo|ε
3: K→dML|ε
4: L→eHf
5: M→K|bLM
Follow(S)={$}+{o}={o,$}
# 在表示式1中,S是一個非終結符,S是孤立的一個表示式,其Follow可以新增$,即新增{$}
# 在表示式2中,S後面跟上了o,所以新增{o}
Follow(H)=Follow(S)+{f}={f,o,$}
# 在表示式1中,S後面跟了什麼,MH後面就跟了什麼,所以新增Follow(S)
# 在表示式4中,H後面跟了f,所以新增{f}
Follow(M)=First(H)+Follow(S)+First(L)={e,o,$}
# 在表示式1中,M後面跟了H,所以新增First(H)
# 在表示式2中可知,H可以推匯出空,所以回到表示式1,S後面跟了什麼,M後面就跟了什麼,所以新增Follow(S)
# 在表示式3中,M後面跟了非終結符L,所以新增First(L)
# 在表示式5中,M後面跟了什麼,bLM後面就跟什麼,都是Follow(M),表示式不變
Follow(L)=First(S)+Follow(K)+{o}+{$}+First(M)+Follow(M)={a,b,d,e,o,$}
# 在表示式2中,L後面跟了非終結符S,所以新增First(S)
# 在表示式2中,First(S)可以推出空,所以此時L後面跟著o,新增{o}
# 在表示式3中,K後面跟了什麼,dML後面就跟了什麼,所以新增Follow(K)
# 在表示式4中,L屬於單一元素,所以新增$
# 在表示式5中,L後面跟上了非終結符M,所以新增First(M)
# 在表示式5中,從上得知,First(M)可以推匯出空,所以此時M後面跟著什麼,L後面就要跟著什麼,所以新增Follow(M)
Follow(K)={$}+Follow(M)={e,o,$}
# 在表示式3中,K是單一字元,新增{$}
# 在表示式5中,M後面跟著什麼,K後面就跟著什麼,所以新增Follow(M)

注意:在書寫Follow集中要時刻檢查First集是否可以為空.

Select計算

分割表示式,如果非空則是First集,是空則為Follow集

Select(S→MH)=First(M)+First(H)+Follow(S)={b,d,e,o,$}
# S以M開頭,加入First(M)
# First(M)可以為空,加入First(H)
# M和H都可以為空,加入Follow(S)
Select(S→a)={a}
# S只能推匯出a,加入{a}
Select(H→LSo)=First(L)={e}
# H以L開頭,並且First(L)不可以為空,即加入First(L)
Select(H→ε)=Follow(H)={f,o,$}
# H推匯出空,加入Follow(H)
Select(K→dML)={d}
# K以終結符d開頭,加入{d}
Select(K→ε)=Follow(K)={e,o,$}
# K可以為空,加入Follow(K)
Select(L→eHf)={e}
# L以終結符e開頭,加入{e}
Select(M→K)=First(K)+Follow(M)={d,e,o,$}
# M可以推出K,加入First(K)
# First(K)可以為空,即M可以加入Follow(M)
Select(M→bLM)={b}
# M可以推出以終結符b開頭,加入{b}

相關文章