1.前端SQL编译介绍
-
词法分析,将 SQL 字符串拆分成包含关键词识别的字符段(Tokens)。
-
语法分析,利用自顶向下或自底向上的算法,将 Tokens 解析为 AST,可以手动,也可以自动。
-
错误检测、恢复、提示推断,都需要利用语法分析产生的 AST。
-
语义分析,做完这一步就可以执行 SQL 语句了,不过对前端而言,不需要深入到这一步,可以跳过。
2.词法分析:字符串分割
(1)Token分类
-
注释。
-
关键字(SELECT、CREATE)。
-
操作符(+、-、>=)。
-
开闭合标志((、CASE)。
-
占位符(?)。
-
空格。
-
引号包裹的文本、数字、字段。
-
方言语法(${variable})。
在词法分析阶段,我们的
Tokens 不需要关心关键词是什么,只要识别是不是关键词即可,只要切分即可。因此,在语法分析阶段,才辨别Token是什么关键词;涉及到语义处理时要考虑上下文。
(2)常见分词方法:
正则表达式分词
争对不同方言或Tokens,会有不同的分词函数。因此整体流程如下:
while (sqlStr) {
//这里的函数每取一次 Token,都将取到的 Token 按长度丢掉,继续匹配剩下的字符串,直到字符串被切分完为止
token = getTokenWhitespace(sqlStr, token) | getTokenBlockComment(sqlStr, token);
sqlStr = sqlStr.substring(token.value.length);
tokens.push(token);
}