编写最简单的SQL解析程序(原理演示)
来源:互联网 发布:php后台管理登录模板 编辑:程序博客网 时间:2024/04/29 08:58
如何写一个SQL解析器呢?这里先抛出第一步:单词切分。下面举个简单例子:
select.l 文件:
%{/* nothing */ enum{ BEGIN_OF_INPUT = 0, SELECT, COLUMN, FROM, TABLE, SEP, END_OF_INPUT }; int state = BEGIN_OF_INPUT;%}%%\n { if (SEP == state) { printf("========= Cong!!! found a valid sql ==========\n"); } else if (BEGIN_OF_INPUT < state) { printf("========= :-( not a valid sql ==========\n"); } state = BEGIN_OF_INPUT; printf("please input a sql and press Enter\n");}SELECT { if (state == (SELECT - 1)) state++; printf("select state=%d\n", state);}FROM { if (state == (FROM - 1)) state++; printf("from state=%d\n", state);}[a-zA-Z_]+ { if (state == (COLUMN - 1) || state == (TABLE - 1)) state++; printf("any word state=%d\n", state);}; { if (state == (SEP - 1)) { state++; } printf("seperator. state=%d\n", state);}. ; /* ignore others */%%main(){ yylex();}
lex select.l gcc lex.yy.c -ll
运行:
./a.out
效果截图:
注意:
写lex文件规则的时候,严格的规则必须写在松散的规则前面。下面是一个错误的例子:
[a-zA-Z_]+ { if (state == (COLUMN - 1) || state == (TABLE - 1)) state++; printf("any word state=%d\n", state);}FROM { if (state == (FROM - 1)) state++; printf("from state=%d\n", state);}因为FROM这个永远都走不到,全部都被[a-zA-Z_]拦住了。
================================================================
5年前写过的关于lex yacc的文章:
VC与YACC、LEX集成
一个简单的C语言词法分析与语法分析器【原】
- 编写最简单的SQL解析程序(原理演示)
- 一个简单程序演示container_of的原理
- C#事件演示程序1)——一个最简单的C#事件处理程序
- java编写最简单的sqlite程序
- 最简单的贝叶斯分类器演示(含Matlab程序)
- 最简单的贝叶斯分类器演示(含Matlab程序)
- 最简单的贝叶斯分类器演示(含Matlab程序)
- 最简单的Servlet程序+原理
- 解析最简单的DirectX程序“Blank Window”(一)
- 解析最简单的DirectX程序“Blank Window”(二)
- 解析最简单的DirectX程序“Blank Window”(三)
- 最简单的WINDOWS程序详细解析.
- C++简单程序设计(怎样编写简单程序最基本的部分)
- 如何编写最简单的MapReduce之WordCount程序
- SpringBoot +maven +idea 最简单的一个web程序的演示流程
- 大小非吃人成本最简单的演示!!!
- 最简单的js css Tab 演示
- 使用Scala编写的简单程序透彻解析
- VC6.0 怎样将MFC的单文档程序转换成多文档
- Android ADB Shell命令大全
- tcp拥塞控制
- javascript的常用函数
- 对HBase中Bloomfilter类型的设置及使用的理解
- 编写最简单的SQL解析程序(原理演示)
- linux中shell变量
- make命令详解
- PHP中获取文件扩展名的N种方法
- FreeSwitch作为中转网关
- 【java常见问题】——如何获取文件夹大小?
- Linux Shell 中的反引号,单引号,双引号
- 数位板入手
- Hibernate session 获取方式浅谈