内容提要
Postgres语言服务器的开发正在进行中,解析器是其核心。我们决定使用libpg_query进行SQL解析,以处理Postgres复杂的语法。解析器将输入字符串转换为语法树,处理语法错误并提取结构信息。未来将继续改进解析器,提升Postgres的开发体验。
延伸解读
解析器为何成为语言服务器的核心
语言服务器需要将源代码转换为语义模型,而解析器负责将原始字符串转换为语法树,从而提取结构信息。Postgres 语法复杂且不断演进,现有工具稀缺且维护不佳。因此,解析器的质量直接决定了语言服务器能否提供准确的代码智能功能,如错误检测和类型推断。
选择 libpg_query 的权衡
libpg_query 能可靠解析 SQL,但设计目标是解析可执行 SQL,而非提供语言智能。它只暴露 AST 接口,不提供 CST,且节点位置信息不完整。团队通过逆向工程,结合 AST 和 token 流构建 CST,并利用 protobuf 定义自动生成代码,以减少手动实现。
容错解析与语句级错误处理
语言服务器需优雅处理不完整或格式错误的输入。libpg_query 的 parse API 遇到任何语法错误都会导致整个输入解析失败。为此,团队实现了弹性源解析器,将输入拆分为独立 SQL 语句并逐个解析,从而允许每个语句独立报告语法错误,提升开发体验。
当前限制与未来方向
当 SQL 无效时,解析器返回的 CST 仅为扁平 token 列表,语句解析器尚不具备容错性。团队计划逐步添加自定义容错实现,并将 libpg_query 解析器作为后备。未来还将支持 PL/pgSQL 函数体解析,并完善语义数据模型和语言服务器本身。
Q&A
Postgres语言服务器的解析器有什么作用?
解析器将输入字符串转换为语法树,处理语法错误并提取结构信息。
为什么选择使用libpg_query进行SQL解析?
因为libpg_query能够可靠地解析Postgres复杂的SQL语法,避免了创建自定义解析器的复杂性。
解析器如何处理语法错误?
解析器允许独立处理每个SQL语句的语法错误,确保即使有错误也能继续解析其他语句。
Postgres语言服务器的未来计划是什么?
未来将继续改进解析器,提升开发体验,并增加对PL/pgSQL函数体解析的支持。
解析器是如何构建语法树的?
解析器将输入字符串转换为一系列标记,然后构建出语法树以提取结构信息。
Postgres语言服务器的开发背景是什么?
Postgres越来越受欢迎,但现有工具支持不足,开发者需要更好的SQL编程体验。