什麼是 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 未定義的所有條目都被認為是“錯誤”。
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP