HeadlinesBriefing HeadlinesBriefing.com

DuckDB v2.0 采用 PEG 引擎取代 SQL 解析器

Hacker News •
×

DuckDB v2.0 引入了全新的基于 PEG 的 SQL 解析器,取代了自 2018 年项目首次提交以来一直使用的源自 PostgreSQL 的解析器。此前由 Bison 生成的 LALR(1) 解析器随着 Duck SQL 的演进,由于移进/归约(shift/reduce)和归约/归约(reduce/reduce)冲突而变得越来越难以扩展。新解析器采用解析表达式文法(Parsing Expression Grammars)构建,通过显式排列备选项的顺序来消除这些冲突,并支持运行时扩展。

该解析器通过三个阶段处理 SQL 查询:分词器(tokenizer)、解析器(parser)和转换器(transformer)。分词器将输入拆分为关键字和标识符等标记。解析器根据 Duck SQL 文法验证语法,生成解析树。转换器将其转换为 DuckDB 内部的 AST,供绑定器(binder)使用。

开发始于一个仅能处理部分 SQL 的研究原型。它被逐步扩展,并在 DuckDB v1.5 中作为实验性功能引入。完整的文法现在支持所有语句和表达式类型、正确的运算符优先级、恰当的关键字分类,以及与现有 AST 结构的兼容性。

尽管实现发生了重大变化,但 Duck SQL 本身保持不变。新解析器还改进了错误报告,为语法错误提供更好的上下文信息。这一转变与其他系统的类似举措一致,例如 Python 3.9 也采用了基于 PEG 的解析以获得更大的灵活性。

来源: Hacker News · 由HeadlinesBriefing整理摘要