1. 解析引擎
解析过程分为词法解析和语法解析。 解析引擎在 parsing 包下,包含两大组件:
- Lexer:词法解析器。
- Parser:SQL解析器。
词法解析器用于将SQL拆解为不可再分的原子符号,称为Token。并根据不同数据库方言所提供的字典,将其归类为关键字,表达式,字面量和操作符。 再使用语法解析器将SQL转换为抽象语法树。例如:
SELECT id, name FROM t_user WHERE status = 'ACTIVE' AND age > 18
解析成的抽象语法树如:

两者都是解析器,区别在于 Lexer 只做词法的解析,不关注上下文,将字符串拆解成 N 个分词。而 Parser 在 Lexer 的基础上,进一步理解 SQL表示的行为 。
1.1 Lexer 词法解析器
作用:顺序解析 SQL,将sql字符串分解成 N 个分词(token)。那么每个分词该如何表示呢?
1.1.1 token 和 tokenType
token用于描述当前分解出的词法,包含3个属性:
- TokenType type :词法标记类型
- String literals :当前词法字面量
- int endPosition :literals 在 SQL 字符串中的位置
TokenType 用于描述当前token的类型,分成 4 大类:
- DefaultKeyword :词法关键词
- Literals :词法字面量标记
- Symbol :词法符号标记
- Assist :词法辅助标记


1.1.2 词法解析器
由于不同数据库遵守的 SQL 规范有所不同,所以不同的数据库对应存在不同的 Lexer,维护了对应的dictionary。Lexer内部根据相应数据库的dictionary与sql语句生成一个Tokenizer分词器进行分词。
public final class Tokenizer { //输入 private final String input; //字典 private final Dictionary dictionary; //偏移量 private final int offset; }

