MySQL SQL 解析器深度剖析
1. 解析器基础
解析器以常见的包含语句和两个函数原型开始,yyerror()用于错误处理,emit()用于输出逆波兰表达式(RPN)代码。%union包含四个成员,分别为整数值、浮点数值、字符串指针和子标记,用于存储不同类型的标记值。
%{ #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; }随后是一系列的标记声明,与词法分析器中使用的标记相匹配,同时定义了运算符的优先级。一些标记如COMPARISON和SHIFT具有子标记值,用于表示具体的运算符或移位方向。
%right ASSIGN %left OR %left XOR %left ANDOP %nonassoc IN IS LIKE REGEXP %left NOT '!' %left BETWEEN %left <subtok> COMPARISON /* = <> < > &