在編譯器設計中,LR(0)專案的規範集合是什麼?


對於文法G,LR(0)專案由一個產生式組成,在這個產生式中,符號點(.)被插入到產生式右部的某個位置。

例如 - 對於產生式S → ABC,生成的LR(0)專案將是:

S →∙ ABC

S → A ∙ BC

S → AB ∙ C

S → ABC ∙

產生式S → ε只生成一個專案,即S →∙

規範LR(0)集合有助於構建稱為簡單LR(SLR)分析器的LR分析器。

要為文法建立規範LR(0)集合,需要三樣東西:

  • 增廣文法
  • 閉包函式
  • goto函式

增廣文法 - 如果文法G的開始符號是S,則增廣文法是一個新的文法G',它有一個新的開始符號S'。它還將包含產生式S' → S。

閉包 - 對於上下文無關文法G,如果I是文法G的專案或狀態集,則:

  • I中的每個專案都在closure(I)中。

  • 如果規則A → α.Bβ是closure(I)中的一個規則,並且B有另一個規則B → γ,則closure(I)將包含A → α.Bβ和B → .γ

閉包的計算

過程closure(I)

  • 開始
  • 重複
  • 對於I中的每個規則A→α∙Bβ和G中的B→γ
    • 將B→∙γ新增到I
    • 直到無法再向I新增元素;
  • 結束
  • goto(I,X):如果I中存在產生式A→α∙Xβ,則goto(I,X)定義為A→αX∙β專案的集合的閉包,其中I是專案集,X是文法符號(非終結符)。

構造LR(0)專案規範集合的演算法

  • 開始
  • C = {closure(S′ → ∙ S)}
  • 重複
  • 對於C中的每個元素集I和每個文法符號X,使得goto(I, X)不為空且不在C中
  • 新增goto(I, X)到C
  • 直到無法再向C新增元素集
  • 結束

示例 - 考慮文法

B → Ba | b

求closure(I)和goto(I)

解答

設B →∙ Ba

由於點後出現B。因此,將把左部為B且右部開頭有點的其他產生式新增到閉包中,即,B →∙ B也新增到closure(I)。

Closure(I) 將是 B → ∙ Ba                                         (1)

B → ∙ b                                                                           (2)

因為點後在(1)中我們有B

goto(I, B) 將是 B → B ∙ a

因為點後在(2)中我們有b

goto(I, b) 將是 B → b ∙

更新於:2021年11月1日

5K+ 次瀏覽

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.