PostgreSQL源码解读》(167)——查询# 87(基础知识——语法分析器野牛)

  

  输入一条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      之前   

PostgreSQL源码解读》(167)——查询# 87(基础知识——语法分析器野牛)