在編譯器設計中,SLR、CLR 和 LALR 解析器之間有什麼區別?
SLR 解析器
SLR 代表 “簡單 LR 解析器”。它非常容易且經濟高效地執行。SLR 解析動作和從識別可行字首的確定性有限自動機獲取的 goto 函式。它不會為所有語法專門定義解析動作表,但確實在幾種程式語言的語法上取得了成功。給定一個語法 G。它增強 G 以生成 G’,並且從 G’ 它可以構造 C,即 G’ 的專案集的規範集合。它可以使用以下簡單的 LR 解析表構造技術從 C 構造 ACTION 解析動作函式和 GOTO goto 函式。我們需要了解每個語法的非終結符 A 的 FOLLOW(A)。
CLR 解析器
CLR 指的是規範前瞻。CLR 解析使用 LR(1) 專案的規範集合來構造 CLR(1) 解析表。CLR(1) 解析表與 SLR(1) 解析相比,生成更多狀態。在 CLR(1) 中,它只能在前瞻符號中定位歸約節點。
LALR 解析器
LALR 解析器是前瞻 LR 解析器。它的功能介於 SLR 和 CLR 解析器之間。它是 CLR 解析器的壓縮,因此在此獲得的表將小於 CLR 解析表。
為了構建 LALR(1) 解析表,使用了 LR(1) 專案的規範集合。在 LALR(1) 解析中,具有相同產生式但具有多個前瞻的 LR(1) 專案被分組以形成單個專案集。除了解析表有所不同之外,它通常與 CLR(1) 解析相同。
所有這些 LR 解析器的整體結構都是相同的。它們之間存在一些共同因素,例如大小、它們支援的上下文無關語法的類別以及時間和空間方面的成本,它們在這方面有所不同。
讓我們看看 SLR、CLR 和 LALR 解析器之間的比較。
| SLR 解析器 | LALR 解析器 | CLR 解析器 |
|---|---|---|
| 它非常容易且便宜地實現。 | 它也很容易且便宜地實現。 | 它實現起來很昂貴且困難。 |
| SLR 解析器的大小最小。 | LALR 和 SLR 的大小相同。因為它們的狀態數較少。 | CLR 解析器最大。因為狀態數非常大。 |
| SLR 中的錯誤檢測不是立即的。 | LALR 中的錯誤檢測不是立即的。 | CLR 解析器可以立即進行錯誤檢測。 |
| SLR 無法為某些類別的語法生成解析表。 | 它的功能介於 SLR 和 CLR 之間,即 SLR ≤ LALR ≤ CLR。 | 它功能非常強大,適用於大量語法。 |
| 它需要較少的時間和空間複雜度。 | 它需要更多的時間和空間複雜度。 | 它也需要更多的時間和空間複雜度。 |
廣告
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP