50.3. The Parser Stage
Posted 丹心明月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了50.3. The Parser Stage相关的知识,希望对你有一定的参考价值。
50.3 解析阶段
解析阶段包含两部分:
-
在gram.y和scan.l中定义的解析器使用unix工具bison和flex构建;
-
转换进程(transformation process)对解析器返回的数据结构进行更新和扩充;
50.3.1 解析器
解析器需要检查查询字符串(即客户端发送来的纯文本)的语法。如果语法正确,则会创建并返回解析树;否则报错。解析器和词法分析器使用unix工具bison和flex实现。
词法分析器在文件scan.l中定义,用以识别限定符、SQL关键词等。对于发现的每个关键词或限定符,会打一个标签(token),并将其返回解析器。
解析器在文件gram.y中定义, 由一组语法规则和每当触发规则时执行的动作(action)组成。动作代码(实际上是C代码)用于构建解析树。
文件scan.l使用flex转换为C源文件scan.c,gram.y使用bison转换为gram.c。这之后,使用C编译器创建解析器。不要更改生成的C文件,因为每次调用flex或bison都会重写它们。
注:提到的转换和编译一般使用makefiles自动完成。
50.3.2 转换进程
解析阶段创建了一个固定规则的解析树,其未检索系统视图中的信息,故而对所要操作的语义不清晰。在解析完成后,转换进程以解析树为输入,对其进行语义处理,以分析查询所使用的表、函数、操作符等。表示此信息的数据结构称为查询树。
将原解析和语义解析分开的原因是,系统视图的检索只能在事务中完成,但却不想在接收到查询字符串后立马开始一个事务。原解析阶段可以识别事务控制命令(BEGIN,ROLLBACK等),它们可无需进一步解析就可以正确执行。一旦我们知道当前处理的是实际的查询(例如SELECT或UPDATE),则可以开始一个事务。只有此时才可调用转换进程。
转换进程生成的查询树与原始的解析树结构差不多,不过也有一些主要差异。比如,解析树中的FuncCall节点表示语法上看起来是函数调用。不过在解析树,取决于调用的是普通函数还是聚合函数,节点名称变成了FuncExpr或Aggref。而且,有关列实际数据类型和表达式结果的信息也添加到了查询树中。
以上是关于50.3. The Parser Stage的主要内容,如果未能解决你的问题,请参考以下文章
The file /mnt/boot/grub/stage1 not read correctly 问题
The 1st Universal Cup Stage 5: Osijek, February 25-26, 2023 题解
The 1st Universal Cup Stage 7: Zaporizhzhia, March 11-12, 2023(Determinant, or...?-子矩阵,det)
An exception has occurred, use %tb to see the full traceback.----parser.parse_args()报错