編譯器設計中 LR 分析器的型別有哪些?
有三種類型的 LR 分析器,如下所示:
簡單 LR 分析器 (SLR) − SLR 代表 "Simple LR Parser"。它非常容易且執行成本低。但它無法為某些類別的語法生成解析表,即為什麼使用 CLR 和 LALR,它們主要實現了所有類別或型別的語法。它構建解析表,有助於執行輸入字串的解析。如果給定上下文無關文法,則可以進行 SLR 解析。在 LR (0) 中,0 表示沒有前瞻符號。
SLR 解析動作和 goto 函式來自確定性有限自動機,該自動機識別可行的字首。它不會為所有語法專門生成解析動作表,但確實在某些程式語言的語法上實現了。給定一個語法 G。我們增強 G 以生成 G',並且從 G' 它可以構建 C,即 G' 的專案規範集合。
規範前瞻 LR 分析器 (CLR) − CLR 定義規範前瞻。CLR 解析使用 LR (1) 專案的規範集合來構建 CLR (1) 解析表。與 SLR (1) 解析相比,CLR (1) 解析表生成更多狀態。在 CLR (1) 中,它只能在前瞻符號中定位歸約節點。
文法 LR (1) 專案集合的構建
它需要三件事
- 增強文法
- 閉包函式
- goto 函式
增強文法 − 它是一個新的文法 G',它包含一個新的產生式 S' → S 以及給定文法 G 的所有其他產生式。
閉包
- 過程 closure (I)
- 開始 重複
- 對於 I 中的每個專案 A→α ∙B β, a,
- 每個產生式 B→γ 和
- 每個終結符 b∈FIRST (β a)
- 如果 B→ ∙ γ 不在 I 中
- 將 B→ ∙γ,b 新增到 I 中
- 直到無法再將更多元素加入到 I;
- 結束
𝐠𝐨𝐭𝐨(𝐈, 𝐗)− 如果 I 中存在產生式 𝐀 → 𝛂 ∙ 𝐗 𝛃, 𝐚,則 𝐠𝐨𝐭𝐨(𝐈, 𝐗) 是 𝐀 → 𝛂 𝐗 ∙ 𝛃, 𝐚 專案集的閉包。
前瞻 LR 分析器 (LALR) − LALR 分析器是前瞻 LR 分析器。它的功能介於 SLR 和 CLR 分析器之間。它是 CLR 分析器的壓縮,因此在此獲得的表將小於 CLR 解析表。
在這裡,首先,我們將構建 LR (1) 專案。接下來,我們將查詢具有相同第一個元件的專案,並將它們合併以形成單個專案集。這意味著狀態具有相同的第一個元件,但不同的第二個元件可以整合到單個狀態或專案中。