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


已知文法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}

判斷是否是LL(1)文法

LL(1)文法就是同一非終結符推出來的Select集合相交為空,現在開始逐一判斷

Select(S→MH)∩Select(S→a)
Select(H→LSo)∩Select(H→ε)
Select(K→dML)∩Select(K→ε)
# L只有一個表達式,省略L
Select(M→K)∩Select(M→bLM)

易知,上述表達式都為空,所以這個表達式是LL(1)文法

預測分析表的書寫

先列出First集和Follow集的表格

First Follow
S
H
K
L
M

然后將非終結符、終結符作為橫縱行,填入表達式

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM