什麼是 CLR(1) 解析器?


CLR 定義規範前瞻。CLR 解析使用規範的 LR(1) 專案集合來構建 CLR(1) 解析表。與 SLR(1) 解析相比,CLR(1) 解析表具有更多狀態。在 CLR(1) 中,它只能在先行符號中定位歸約節點。

CLR 解析器的執行方式


為語法構建 LR(1) 專案集合

它需要三樣東西

  • 擴充語法
  • 閉包函式
  • goto 函式

擴充語法 這是一個新的語法 G′,它包含一個新的產生式

S′ → S,以及給定語法 G 的所有其他產生式。

閉包

過程 closure (I)

begin
Repeat
for each item A → α ∙ B β, a in I,
   each production B → γ and
      each terminal b ∈ FIRST (β a)
If B → ∙ γ is not in I
Add B → ∙ γ, b to I
Until no more elements can be joined to I;
end

𝐠𝐨𝐭𝐨(𝐈, 𝐗): 如果在 I 中存在產生式 𝐀 → 𝛂 ∙ 𝐗 𝛃,𝐚,則 𝐠𝐨𝐭𝐨(𝐈, 𝐗) 是 𝐀 → 𝛂 𝐗 ∙ 𝛃,𝐚 的專案集的閉包。

LR(1) 專案集構建演算法

begin
C = {closure(S′→∙S,$)}
Repeat
for each set of items 𝐈 in C and each grammar symbol X (terminal or non-terminal)
   Add 𝐠𝐨𝐭𝐨(𝐈, 𝐗) 𝐭𝐨 𝐂
Until no more sets of elements can be added to C.
end.

規範 LR 解析表構建演算法

輸入 − 擴充語法 G′

輸出 − CLR 解析表

方法

  • 首先構建專案集 C = {I0, I1, I2 … … In},其中 C 是 G 的 LR(1) 專案的集合。

  • 解析操作基於每個專案或狀態 I1

各種操作:

  • 如果 A → α ∙ a β 位於 Ii 中,並且 goto(Ii, a) = Ij,則在 Action 表中建立條目 Action[i, a] = shift j。
  • 如果 A → α ∙ 位於 Ii 中,則在 Action 表中將 Action[i, a] 設定為 reduce A→α。“此處,A 不應為 S′。
  • 如果 S′ → S ∙ 位於 Ii 中,則 Action[i, $] = accept。
  • SLR 表的 goto 部分可以填充為:
  • 如果 goto(Ii, A) = Ij,則 goto[i, A] = j


  • 規則 2 和 3 未定義的所有條目都被認為是“錯誤”。

更新於:2021年11月2日

5K+ 次瀏覽

啟動你的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.