构建你自己的 SQLite,第 3 部分:SQL 解析 101

主要观点:

  • 已实现.tables命令,准备编写自己的 SQL 解析器,初始限制为只支持select语句的子集。
  • SQL 解析器遵循词法分析和语法分析两步流程,分别将输入字符串分组为有意义的单元和匹配语法规则生成抽象语法树(AST)。
  • 定义了Token类型表示 SQL 方言的单个标记,实现了tokenize函数进行词法分析。
  • 决定用常规方式表示 SQL 语句,定义了Statement等相关 Rust 类型。
  • 使用递归下降算法编写解析器,定义了ParserState结构体和多个解析函数,如parse_expr等。
  • 最后通过parse_statement函数将输入 SQL 字符串解析为 AST,并在 REPL 中进行测试。

关键信息:

  • SQLite 文件格式及相关命令实现的系列文章部分 1 和 2 已完成。
  • 支持的select语句形式为select <columns> from <table>
  • 词法分析将字符分组为标记,语法分析生成 AST。
  • Token类型及as_identifier函数的定义。
  • 各种 SQL 语句相关 Rust 类型的定义及示例。
  • 递归下降解析算法及ParserState结构体和解析函数的实现。
  • 在 REPL 中测试解析器的代码修改。

重要细节:

  • SQL 对大小写不敏感,标识符统一转为小写。
  • 解析函数如parse_expr根据当前标记进行相应解析操作。
  • parse_statement函数先进行词法分析得到标记,再通过ParserState进行解析并处理分号。
  • 在 REPL 中,除.exit.tables命令外,其他输入作为 SQL 语句进行解析和处理。
阅读 26
0 条评论