输入一条SQL语句,PostgreSQL如何解析输入的SQL,识别SQL类型以及基表/字段等信息?接下来的几节将逐一进行解析。
本节介绍了开源工具语法分析器野牛。
一、野牛
<强>
基本概念
强>
野牛是一个语法分析器,和Flex配合使用,它可以将用户提供的语法规则转化成一个语法分析器.Flex生成牌流,野牛根据定义的产生式和动作表来解析标记流,从而解析句子。
野牛自定义语法文件,一般以.y作为文件扩展名,其格式如下:
<前>
<代码>
% {
声明
%}
定义
% %
产品
% %
用户子程序
代码>
>之前
其中声明(声明)和用户子程序(用户自定义过程)和Flex的.l文件是一样的,野牛会将这些代码原样的拷贝到y.tab.c文件中,定义(定义)段和Flex类似,也是在这个段定义一些野牛专有的变量,稍后再解释这个文件中的这个段里的代码;最重要的是产品段,这里面是用户编写的语法产生式。
<强>
示例
强>
下面用Flex和Bison实现一个简单的乘法器。
mul.l
词法文件
<前>
<代码>
% {
# include“y.tab.h”
空白yyerror (const char *味精);
空白undefined_char (char c);
%}
% %
[0 - 9]+ {yylval=atoi (yytext);返回T_NUMBER;}
* ()\ [n]{返回yytext [0];}
。{返回0;/*当满足一切结束*/}
% %
int yywrap(空白){
返回1;
}
空白undefined_char (char c) {
char buf[32]=拔薹ㄊ侗鸬淖址??”;
但[24]=c;
yyerror (buf);
}
空白yyerror (const char *味精){
printf(“错误:% s \ n”, msg);
退出(1);
}
代码>
>之前
mul.y
语法文件
<前>
<代码>
% {
# include & lt; stdio.h>
%}
% token T_NUMBER
%离开‘*’
% %
S: S E ' \ n ' {printf("结果=% d \ n ", $ 2);}
|/*空*/{/*空*/}
;
艾凡:E ' * ' E{$ $=1 * 3美元;}
| T_NUMBER{$ $=1美元;}
;
% %
int main () {
返回yyparse ();
}
代码>
>之前
makefile
<前> <代码> CC=gcc 出=mul OBJ=lex.yy。o y.tab.o MUL_L=mul.l MUL_Y=mul.y 构建:$ () 运行:$ () 。/(美元) 清洁: rm - f *。o lex.yy。c y.tab。c y.tab。h y。输出(美元) (出):美元(OBJ) (CC) - o() $美元(OBJ) lex.yy。c:美元(MUL_L) y.tab.c flex $ & lt; y.tab。c: $ (MUL_Y) 野牛-vdty $ & lt; 代码> >之前执行:
<前> <代码> [xdb@localhost mul]美元使运行/mul。 23 * 3 结果=69 代码> >之前