赞
踩
功能:将用户输入的SQL语句序列转换为一个可执行的操作序列,并返回查询的结果集。
SQL的解析引擎包括查询编译与查询优化和查询的运行,主要包括3个步骤:
flex是一个词法分析工具,其输入为后缀为.l的文件,输出为.c的文件. 示例是一个类似Unix的单词统计程序wc
。
- %option noyywrap
- %{
- int chars = 0;
- int words = 0;
- int lines = 0;
- %}
-
- %%
-
- [_a-zA-Z][_a-zA-Z0-9]+ { words++; chars += strlen(yytext); }
- \n { chars++ ; lines++; }
- . { chars++; }
-
- %%
-
- int main()
- {
- yylex();
- printf("%8d %8d %8d\n",lines,words,chars);
- return 0;
- }

.l文件通常分为3部分:
- %{
- definition
- %}
-
- %%
- rules
- %%
- code
definition
部分为定义部分,包括引入头文件,变量声明,函数声明,注释等,这部分会被原样拷贝到输出的.c文件中。
rules
部分定义词法规则,使用正则表达式定义词法,后面大括号内则是扫描到对应词法时的动作代码。
code
部分为C语言的代码。yylex
为flex的函数,使用yylex
开始扫描。
%option
指定flex扫描时的一些特性。yywrap
通常在多文件扫描时定义使用。常用的一些选项有
noyywrap
不使用yywrap函数
yylineno
使用行号
case-insensitive
正则表达式规则大小写无关
flex文件的编译
- flex –o wc.c wc.l
- cc wc.c –o wc
Bison
作为一个语法分析器,输入为一个.y的文件,输出为一个.h文件和一个.c文件。通常Bison需要使用Flex作为协同的词法分析器来获取记号流。Flex识别正则表达式来获取记号,Bison则分析这些记号基于逻辑规则进行组合。
计算器的示例:calc.y
- %{
- #include <stdio.h>
- %}
-
- %token NUMBER
- %token ADD SUB MUL DIV ABS
- %token OP CP
- %token EOL
-
- %%
-
- calclist:
- | calclist exp EOL {printf("=%d \n> ",$2);}
- | calclist EOL {printf("> ");}
- ;
- exp: factor
- | exp ADD factor {$$ = $1 + $3;}
- | exp SUB factor {$$ = $1 - $3;}
- ;
- factor:term
- | factor MUL term {$$ = $1 * $3;}
- | factor DIV term {$$ = $1 / $3;}
- ;
- term:NUMBER
- | ABS term ABS { $$ = ($2 >= 0 ? $2 : -$2);}
- | OP exp CP { $$ = $2;}
- ;
- %%
- int main(int argc,char *argv[])
- {
- printf("> ");
- yyparse();
-
- return 0;
- }
- void yyerror(char *s)
- {
- fprintf(stderr,"error:%s:\n",s);
- }
-
- Flex与Bison共享记号,值通过yylval在Flex与Bison间传递。对应的.l文件为
-
- %option noyywrap
- %{
- #include "fb1-5.tab.h"
- #include <string.h>
- %}
-
- %%
- "+" { return ADD;}
- "-" { return SUB;}
- "*" { return MUL;}
- "/" { return DIV;}
- "|" { return ABS;}
- "(" { return O

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。