小巧、快速、可靠。
任選三項。
Lemon LALR(1) 剖析器產生器

1. 概觀

SQLite 的 SQL 語言剖析器是使用稱為「Lemon」的程式碼產生器程式產生的。Lemon 程式會讀取輸入語言的語法,並產生 C 程式碼來實作該語言的剖析器。

1.1. Lemon 原始檔和文件

Lemon 沒有自己的原始碼儲存庫。相反地,Lemon 由 SQLite 原始碼樹中的幾個檔案組成

2. Lemon 的優點

Lemon 會產生 LALR(1) 剖析器。它的運作方式類似於較為常見的工具 YaccBison,但 Lemon 加入了一些重要的改進,包括

2.1. SQLite 中的 Lemon 用法

SQLite 中有兩個地方使用 Lemon。

Lemon 的主要用途是建立 SQL 語言解析器。語法檔案 (parse.y) 由 Lemon 編譯成 parse.c 和 parse.h。parse.c 檔案會併入 合併 中,而不會進一步修改。

Lemon 也用於產生 FTS5 擴充功能中查詢模式表達式的解析器。在此情況下,輸入語法檔案是 fts5parse.y

2.2. 特別針對 SQLite 的 Lemon 自訂設定

將程式碼產生器工具作為專案一部分寄存的其中一個優點是,這些工具可以最佳化,以滿足整體專案的特定需求。Lemon 已從此效應中受益。多年來,Lemon 剖析器產生器已擴充並增強,以提供新的功能和改善 SQLite 的效能。專門設計給 SQLite 使用的 Lemon 的一些特定增強功能包括

SQL 語句的剖析是任何 SQL 資料庫引擎中 CPU 週期的重要消耗者。持續優化 SQLite 的努力讓開發人員花費大量時間調整 Lemon 以產生更快的剖析器。這些努力讓 Lemon 剖析器產生器的所有使用者受益,不只是 SQLite。但如果 Lemon 是單獨維護的工具,要對 SQLite 和 Lemon 進行協調變更會更加困難,因此無法完成這麼多的最佳化。因此,剖析器產生器工具包含在 SQLite 的原始碼樹中,事實證明對工具本身和 SQLite 來說都是淨收益。

3. Lemon 的歷史

Lemon 最初是由 D. Richard Hipp(也是 SQLite 的創建者)編寫的,當時他在 1987 年至 1992 年間就讀於杜克大學研究所。Lemon 的原始建立日期已不可考,但可能約在 1990 年左右。Lemon 會產生 LALR(1) 剖析器。有一個名為「Lime」的伴隨 LL(1) 剖析器產生器工具,但 Lime 的原始碼已遺失。

Lemon 原始碼最初寫成獨立的原始碼檔案,後來才合併成單一的「lemon.c」原始碼檔案。

Lemon 和 SQLite 的作者(Hipp)表示,透過研究 John Ousterhout 的 Tcl 原始原始碼,大幅提升了他的 C 程式設計技巧。Hipp 在 1993 年發現並研究 Tcl。Lemon 是在當時之前編寫的,而 SQLite 是在之後。這兩個產品的編碼風格有明顯的差異,SQLite 顯得更簡潔、更易讀,而且更容易維護。