首页 > 编程知识 正文

PostgreSQL 源码解读(167)- 查询#87(基础知识-语法分析器Bison)

时间:2023-05-04 06:19:09 阅读:213080 作者:4181

输入一条SQL语句,PostgreSQL如何解析输入的SQL,识别SQL类型以及基表/字段等信息?接下来的几节将逐一进行解析.
本节介绍了开源工具语法分析器Bison.

一、Bison

基本概念
Bison是一个语法分析器,和Flex配合使用,它可以将用户提供的语法规则转化成一个语法分析器。Flex生成token stream,Bison根据定义的产生式和动作表来解析token stream,从而解析句子.
Bison自定义语法文件,一般以.y作为文件扩展名,其格式如下:

%{Declarations%}Definitions%%Productions%%User subroutines

其中Declarations(声明)和 User subroutines(用户自定义过程)和Flex的.l文件是一样的,Bison会将这些代码原样的拷贝到y.tab.c文件中;Definitions(定义)段和Flex类似,也是在这个段定义一些Bison专有的变量,稍后再解释这个文件中的这个段里的代码;最重要的是Productions 段,这里面是用户编写的语法产生式.

示例
下面用Flex和Bison实现一个简单的乘法器.
mul.l
词法文件

%{#include "y.tab.h"void yyerror(const char *msg);void undefined_char(char c);%}%%[0-9]+ { yylval = atoi(yytext); return T_NUMBER; }[*()n] { return yytext[0]; }. { return 0; /* end when meet everything else */ }%%int yywrap(void) { return 1;}void undefined_char(char c) { char buf[32] = "Unrecognized character: ?"; buf[24] = c; yyerror(buf);}void yyerror(const char *msg) { printf("Error :%sn", msg); exit(1);}

mul.y
语法文件

%{#include <stdio.h>%}%token T_NUMBER%left '*'%%S : S E 'n' { printf("result = %dn", $2); } | /* empty */ { /* empty */ } ;E : E '*' E { $$ = $1 * $3; } | T_NUMBER { $$ = $1; } ;%%int main() { return yyparse();}

makefile

CC = gccOUT = mulOBJ = lex.yy.o y.tab.oMUL_L = mul.lMUL_Y = mul.ybuild: $(OUT)run: $(OUT) ./$(OUT)clean: rm -f *.o lex.yy.c y.tab.c y.tab.h y.output $(OUT)$(OUT): $(OBJ) $(CC) -o $(OUT) $(OBJ)lex.yy.c: $(MUL_L) y.tab.c flex $<y.tab.c: $(MUL_Y) bison -vdty $<

执行:

[xdb@localhost mul]$ make run./mul23*3result = 69 二、参考资料

Bison

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/6906/viewspace-2641182/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/6906/viewspace-2641182/

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。