引言
词法分析是查询解析的第一步,主要工作是将输入的sql命令转化为带有属性的token,然后进入下一步的语法分析进行语法结构的匹配。本文首先介绍词法分析的基本原理,然后介绍海山数据库中使用的词法分析工具lex,最后对词法分析scan.l文件进行解析。
词法分析基本原理
词法分析的主要工作是识别出sql语句中的各个token,并确定其属性,如下图所示。
要理解该模块的工作原理,需要搞清楚以下几个问题:
1.如何来解析sql命令然后获得token;
2.属性有哪些,如何确定属性。
对于第一个问题,如何将sql语句转化为一组tokens。首先要定义一组模式,该模式表示token的可能表现形式,从sql语句中使用正则表达式进行匹配,提取出一个一个的token。在匹配过程中,有两个指针start_ptr和end_ptr,从初始位置开始扫描,使用状态转化图顺序解析,举一个例子,假设需要识别的模式有【<,>,=,<=,>=,<>】。
在初始时,可能的状态转化图如下图所示:
该图中,若读入的第一个符号是【<】,end_ptr指针往后读入一位,此时可能的状态有【<,<=,<>】,end_ptr指针再往后读入一位,若读到的是【=】,则返回【<=】,若读到的是>,则返回【<>】,若为其他字符,则end_ptr回退到前一位置,并返回【<】。
对于这个过程,可以简单总结一下,存在两个指针:start_ptr和end_ptr,两个指针用来表示当前读取的字符串,若当前的字符串可能与多种模式匹配到,则end_ptr继续向后读取,直到实现最大字符串的匹配或者进行回退消除歧义性。当确定一个token后,start_ptr更新当前位置,并开始下一阶段的匹配。
对于第二个问题,属性有哪些,如何确定其属性。在编译原理中,属性一般可分为以下几类:
属性 | 例子 |
---|---|
标识符 | 表名,列名等 |
关键字 | SELECT,UPDATE,DELETE,… |
运算符 | <,>,<=,>=… |
常量 | 整型,浮点型… |
界限符 | ;,()… |
token