MySQL SQL 解析器详解
1. 词法分析与注释处理
在处理输入时,需要跳过空白字符、注释,并对无效字符进行报错。以下是相关的词法规则:
<COMMENT><<EOF>> { yyerror("unclosed comment"); } /* everything else */ [ \t\n] /* whitespace */ . { yyerror("mystery character '%c'", *yytext); }这里使用了排他起始状态COMMENT来处理 C 风格的注释,<<EOF>>模式用于捕获未闭合的 C 风格注释。
2. 解析器概述
SQL 解析器规模较大,但可以分部分理解。下面是解析器的初始部分:
%{ #include <stdlib.h> #include <stdarg.h> #include <string.h> void yyerror(char *s, ...); void emit(char *s, ...); %} %union { int intval; double floatval; char *strval; int subtok; }