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

输入一条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 :%s\n", msg);
    exit(1);
}

mul.y
语法文件


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

makefile


CC = gcc
OUT = mul
OBJ = lex.yy.o y.tab.o
MUL_L = mul.l
MUL_Y = mul.y
build: $(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
./mul
23*3
result = 69

二、参考资料

Bison

网页名称:PostgreSQL源码解读(167)-查询#87(基础知识-语法分析器Bison)
文章分享:https://www.cdcxhl.com/article12/jjjgdc.html

成都网站建设公司_创新互联,为您提供手机网站建设响应式网站网站设计公司营销型网站建设外贸建站

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

微信小程序开发