小巧。快速。可靠。
三选二。
Lemon LALR(1) 语法分析器生成器

1. 概述

SQLite 的 SQL 语言解析器是使用名为“Lemon”的代码生成器程序生成的。Lemon 程序读取输入语言的语法,并输出 C 代码来实现该语言的解析器。

1.1. Lemon 源文件和文档

Lemon 没有自己的源代码仓库。相反,Lemon 由 SQLite 源代码树中的几个文件组成。

2. Lemon 的优势

Lemon 生成一个 LALR(1) 解析器。它的操作类似于更常见的工具 YaccBison,但 Lemon 添加了重要的改进,包括

2.1. Lemon 在 SQLite 中的应用

Lemon 在 SQLite 中有两个应用场景。

Lemon 的主要用途是创建 SQL 语言解析器。语法文件 (parse.y) 由 Lemon 编译成 parse.c 和 parse.h。parse.c 文件被纳入 amalgamation 且无需进一步修改。

Lemon 还用于为 FTS5 扩展中的查询模式表达式生成解析器。在这种情况下,输入语法文件为 fts5parse.y

2.2. Lemon 特别针对 SQLite 的定制

将代码生成器工具作为项目的一部分托管的优势之一是,可以优化这些工具以满足整个项目的特定需求。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 似乎更简洁、更易读且更易于维护。