输入一条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; }
%%
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); }
| { }
;
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
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1142
183.71 KB下载数642
644.84 KB下载数2755