当前位置:   article > 正文

自己实现一个SQL解析引擎_以select语句为例,设计一个sql解析器,并可对sql解析结果进行可视化

以select语句为例,设计一个sql解析器,并可对sql解析结果进行可视化

自己实现一个SQL解析引擎

功能:将用户输入的SQL语句序列转换为一个可执行的操作序列,并返回查询的结果集。
SQL的解析引擎包括查询编译与查询优化和查询的运行,主要包括3个步骤:

  1. 查询分析:
  2. 制定逻辑查询计划(优化相关)
  3. 制定物理查询计划(优化相关)
  • 查询分析: 将SQL语句表示成某种有用的语法树.
  • 制定逻辑查询计划: 把语法树转换成一个关系代数表达式或者类似的结构,这个结构通常称作逻辑计划。
  • 制定物理查询计划:把逻辑计划转换成物理查询计划,要求指定操作执行的顺序,每一步使用的算法,操作之间的传递方式等。
    查询分析各模块主要函数间的调用关系:

    图1.SQL引擎间模块的调用关系

FLEX简介

flex是一个词法分析工具,其输入为后缀为.l的文件,输出为.c的文件. 示例是一个类似Unix的单词统计程序wc

  1. %option noyywrap
  2. %{
  3. int chars = 0;
  4. int words = 0;
  5. int lines = 0;
  6. %}
  7. %%
  8. [_a-zA-Z][_a-zA-Z0-9]+ { words++; chars += strlen(yytext); }
  9. \n { chars++ ; lines++; }
  10. . { chars++; }
  11. %%
  12. int main()
  13. {
  14. yylex();
  15. printf("%8d %8d %8d\n",lines,words,chars);
  16. return 0;
  17. }


.l文件通常分为3部分:

  1. %{
  2. definition
  3. %}
  4. %%
  5. rules
  6. %%
  7. code


definition部分为定义部分,包括引入头文件,变量声明,函数声明,注释等,这部分会被原样拷贝到输出的.c文件中。
rules部分定义词法规则,使用正则表达式定义词法,后面大括号内则是扫描到对应词法时的动作代码。
code部分为C语言的代码。yylex为flex的函数,使用yylex开始扫描。
%option 指定flex扫描时的一些特性。yywrap通常在多文件扫描时定义使用。常用的一些选项有
noyywrap 不使用yywrap函数
yylineno 使用行号
case-insensitive 正则表达式规则大小写无关

flex文件的编译

  1. flex –o wc.c wc.l
  2. cc wc.c –o wc


Bison简介

Bison作为一个语法分析器,输入为一个.y的文件,输出为一个.h文件和一个.c文件。通常Bison需要使用Flex作为协同的词法分析器来获取记号流。Flex识别正则表达式来获取记号,Bison则分析这些记号基于逻辑规则进行组合
计算器的示例:calc.y

  1. %{
  2. #include <stdio.h>
  3. %}
  4. %token NUMBER
  5. %token ADD SUB MUL DIV ABS
  6. %token OP CP
  7. %token EOL
  8. %%
  9. calclist:
  10. | calclist exp EOL {printf("=%d \n> ",$2);}
  11. | calclist EOL {printf("> ");}
  12. ;
  13. exp: factor
  14. | exp ADD factor {$$ = $1 + $3;}
  15. | exp SUB factor {$$ = $1 - $3;}
  16. ;
  17. factor:term
  18. | factor MUL term {$$ = $1 * $3;}
  19. | factor DIV term {$$ = $1 / $3;}
  20. ;
  21. term:NUMBER
  22. | ABS term ABS { $$ = ($2 >= 0 ? $2 : -$2);}
  23. | OP exp CP { $$ = $2;}
  24. ;
  25. %%
  26. int main(int argc,char *argv[])
  27. {
  28. printf("> ");
  29. yyparse();
  30. return 0;
  31. }
  32. void yyerror(char *s)
  33. {
  34. fprintf(stderr,"error:%s:\n",s);
  35. }
  36. Flex与Bison共享记号,值通过yylval在Flex与Bison间传递。对应的.l文件为
  37. %option noyywrap
  38. %{
  39. #include "fb1-5.tab.h"
  40. #include <string.h>
  41. %}
  42. %%
  43. "+" { return ADD;}
  44. "-" { return SUB;}
  45. "*" { return MUL;}
  46. "/" { return DIV;}
  47. "|" { return ABS;}
  48. "(" { return O
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/912937
推荐阅读
相关标签
  

闽ICP备14008679号