構造 LL(1) 分析表的步驟與例題解析

肖朋偉發表於2019-06-21

構造 LL(1) 分析表的步驟與例題解析

易錯點及擴充套件:

1、求每個產生式的 SELECT 集

2、注意區分是對誰 FIRST 集 FOLLOW 集

3、開始符號的 FOLLOW 集包含 #

4、各集合對對應的物件以及含義

物件 含義
FIRST 集 是對產生式右部 右部內部的所有終結符集,可能為 ε
FOLLOW 集 是對產生式左部(非終結符) 非終結符後面緊跟的終結符,可能為 #,和該非終結符推匯出的右部無關(因為LL(1)文法不包含遞迴,所以右部不會再有該非終結符,所以不能通過該右部判斷該非終結符後跟集合)
SELECT 集 是對產生式 需要考慮產生式右部的不同情況,進一步確定是根據 FIRST 集還是 FOLLOW 集

5、SELECT 集的定義
注: 注意區分 FIRST 集 FOLLOW 時是對 α 還是 A

給定文法 G,對於產生式 A→α,α ∈ V*,則可選集 SELECT(A→α) 有:
(1)若 α ≠ ε,且 α ≠+> ε,則 SELECT(A→α) = FIRST(α)
(2)若 α ≠ ε,但 α =+> ε,則 SELECT(A→α) = FIRST(α) ∪ FOLLOW(A)
(3)若 α = ε,則 SELECT(A→α) = FOLLOW(A)

描述:

  • 第 1 條是,當 α ≠ ε,且通過1次或多次推不出 ε,SELECT(A→α) = FIRST(α)
  • 第 2 條是,當 α ≠ ε,但 α 經有限步可推出 ε,SELECT(A→α) = FIRST(α) ∪ FOLLOW(A)
    (注意是一個 α,一個 A)
  • 第 3 條是,當 α = ε,SELECT 集就等於左部 A 的 FOLLOW 集

    解題時,先判斷是否為 ε,是則用第(3)條,否則再判斷能否通過1次或多次推出 ε,是則用第(2)條,否則用第(1)條

    求 FIRST,FOLLOW,SELECT 集詳細例題可參考:
    《編譯原理》-用例題理解-自頂向下語法分析及 FIRST,FOLLOW,SELECT集,LL(1)文法

6、LL(1) 分析表的結構

分析表是一個二維陣列 M[A,a],其中 A 表示行,是非終結符,a 表式列是終結符或 #。

  • M[A,a] 中若有產生式,表明 A 可用該產生式推導,以求與輸入符號 a 匹配。
  • M[A,a] 中若為空,表明 A 不可能推匯出與 a 匹配的字串

7、LL(1) 分析表構造方法:

  • 若 a∈SELECT(A→α),則把 A→α 加至 M[A, a] 中
  • 把所有無定義的 M[A, a] 標上“出錯標誌”。為了使表簡化,表中空白處為出錯

例題:

已給文法:

G[S]: S→aH
H→aMd
H→d
M→Ab
M→ε
A→aM
A→e

(1)求 SELECT 集
(2)證明文法是 LL(1) 文法
(3)構造 LL(1) 分析表

解析:

求 SELECT 集:

產生式 FIRST 集 FOLLOW 集 SELECT 集
S→aH 分析: 對該產生式,可知 FIRST(aH) = {a};也可知應將 FOLLOW(S) = {#} 加到 FOLLOW(H) 中 {a} FOLLOW(S) = {#} SELECT(S→aH) = FIRST(aH) = {a}
H→aMd 分析: 對該產生式,可知 FIRST(aMd) = {a};也可知應將 d 加到 FOLLOW(M) 中 {a} FOLLOW(H) = {#} SELECT(H→aMd) = FIRST(aMd) = {a}
H→d 分析: 對該產生式,可知 FIRST(d) = {d} {d} SELECT(H→d) = FIRST(d) = {d}
M→Ab 分析: 對該產生式,可知 FIRST(Ab) = {a, e};也可知應將 b 加到 FOLLOW(A) 中 {a, e} FOLLOW(M) = {b, d} SELECT(M→Ab) = FIRST(Ad) = {a, e}
M→ε {ε} SELECT(M→ε) = FOLLOW(M) ={d, b} 求法: 由產生式 H→aMd,所以將 d 放入 FOLLOW(M);由產生式 A→aM 所以把 FOLLOW(A) 加至 FOLLOW(M) 中。同理 求 FOLLOW(A),由產生式 M→Ab,FOLLOW(A) = {b}。故 FOLLOW(M) = {d ,b}
A→aM 分析: 對該產生式,可知 FIRST(aM) = {a};也可知應將 FOLLOW(A) 加到 FOLLOW(M) 中 {a} FOLLOW(A) = {b} SELECT(A→aM) = FIRST(aM) = {a}
A→e 分析: 對該產生式,可知 FIRST(e) = {e} {e} SELECT(A→e) = FIRST(e) = {e}

證明文法是 LL(1) 文法(2 分)

定理:同一非終結符的 SELECT 交集為空集,則該文法是 LL(1) 文法:

  • SELECT(H→aMd) ∩ SELECT(H→d) = ∅

  • SELECT(M→Ab) ∩ SELECT(M→ε) = ∅

  • SELECT(A→aM) ∩ SELECT(A→e) = ∅

所以該文法是 LL(1) 文法

構造 LL(1) 分析表(1 分)

分析表是一個二維陣列 M[A,a],其中 A 表示行是非終結符,a 表式列是終結符或 #。根據 SELECT 集構造分析表:

a b d e
S S→aH
H H→aMd H→d
M M→Ab M→ε M→ε M→Ab
A A→aM A→e

相關文章