在mysql源码中,解析sql在sql_yacc.yy中实现,这个文件是一个硕大的文件,用bison来转换为c文件。

在《编译原理及实践》中有yacc介绍,编译原理是很深奥的科目,学好了对编程技术好很大的帮助,可惜当初没好好学,需要回炉一下。

这里是从《编译原理及实践》的摘录。

一个简单的算术表达式的计算器。calc.y,BNF文法如下:

%{

#include

#include

%}

%token NUMBER

%%

command : exp { printf("%d\n", $1);}

;

exp : exp '+' term { $$ = $1 + $3 ;}

| exp '-' term { $$ = $1 - $3 ;}

| term { $$ = $1 ;}

;

term : term '*' factor { $$ = $1 * $3 ;}

| factor { $$ = $1 ;}

;

factor : NUMBER { $$ = $1 ;}

| '(' exp ')' { $$ = $2 ;}

;

%%

main(){

/*extern int yydebug ;    ------- 此处为debug显示yacc执行调用用

yydebug = 1 ;*/

return yyparse();

}

int yylex(void){           -------可以通过lex工具来进行词法分析,这里用手工实现

int c ;

while( (c = getchar()) == ' ');

if( isdigit(c) ){

ungetc(c, stdin);

scanf("%d", &yylval);

return (NUMBER);

}

if (c == '\n') return 0 ;      ------0表示输入结束,结束词法分析

return (c) ;

}

int yyerror(char* s){

fprintf(stderr,"%s\n",s);

return 0 ;

}

上面的yylex,可以通过lex来实现,这里为手工实现。

同过main函数可以看出,执行yyparse,这个为yacc这类的工具产生的的方法,就是根据文法执行%%之间的用户定义的操作。

每个在L A L R ( 1 )分析栈中的符号值都可通过使用以$开始的伪变量来引用。$ $代表刚才被识别出来的非终结符的值,也就是在文法规则左边的符号。伪变量$ 1、$ 2、$ 3等等都代表了文法规则右边的每个连续的符号。

个人理解就是当文法匹配,执行{}里面的语句。

执行一下看看效果,bison -y calc.y  gcc y.tab.c -o test ----y.tab.c为自动产生的c文件

执行./test

程序已经可以跑了,当输入12+4回车时,结果已经出来了。

把main函数的注释去掉,用bison -y -t 产生c文件,再用gcc y.tab.c -o test 编译

执行./test

显示如下:

Starting parse

Entering state 0

Reading a token: 12+3   ---此处为手工输入的值

Next token is token NUMBER ()

Shifting token NUMBER ()

Entering state 1

Reducing stack by rule 7 (line 19):   -----19行为factor : NUMBER { $$ = $1 ;}

$1 = token NUMBER ()

-> $$ = nterm factor ()

Stack now 0

Entering state 6

Reducing stack by rule 6 (line 17):  -----17行为factor { $$ = $1 ;}

$1 = nterm factor ()

-> $$ = nterm term ()

Stack now 0

Entering state 5

Reading a token: Next token is token '+' ()  ---解析到+号

Reducing stack by rule 4 (line 14):   ----14行为term { $$ = $1 ;}

$1 = nterm term ()

-> $$ = nterm exp ()

Stack now 0

Entering state 4

Next token is token '+' ()

Shifting token '+' ()

Entering state 9

Reading a token: Next token is token NUMBER ()

Shifting token NUMBER ()

Entering state 1

Reducing stack by rule 7 (line 19):  -----19行为factor : NUMBER { $$ = $1 ;}

$1 = token NUMBER ()

-> $$ = nterm factor ()

Stack now 0 4 9

Entering state 6

Reducing stack by rule 6 (line 17):  -----17行为factor { $$ = $1 ;}

$1 = nterm factor ()

-> $$ = nterm term ()

Stack now 0 4 9

Entering state 13

Reading a token: Now at end of input.

Reducing stack by rule 2 (line 12):   ----12行为exp : exp '+' term { $$ = $1 + $3 ;}

$1 = nterm exp ()

$2 = token '+' ()

$3 = nterm term ()

-> $$ = nterm exp ()

Stack now 0

Entering state 4

Now at end of input.

Reducing stack by rule 1 (line 10): ----10行为command : exp { printf("%d\n", $1);}

$1 = nterm exp ()

15

-> $$ = nterm command ()

Stack now 0

Entering state 3

Now at end of input.

Stack now 0 3

Cleanup: popping nterm command ()

yacc这东西还挺神奇,java也有个javacc,也能实现同样的功能,amoeba中有用到。

mysql yacc 解析_yacc介绍相关推荐

  1. mysql源码包结构,mysql源码结构介绍

    mysql源码非常庞大,直接去看肯定毫无头绪.至少需要知道哪个目录是做什么的,才能有一定的条理.现在对mysql的源码结构做初步介绍 目录结构 ==来自622463 MySQL运维内参:MySQL.G ...

  2. MySQL—05—MySQL如何处理SQL语句;MySQL数据库存储引擎介绍;

    一. MySQL 中的执行计划 1 MySQL 执行计划 在 MySQL 中可以通过 explain 关键字模拟优化器,执行 SQL 语句,从而知道 MySQL 是 如何处理 SQL 语句的. 2 M ...

  3. mysql新增列并同时增加数据_图解MySQL | [原理解析] MySQL 为表添加列 是怎么quot;立刻quot;完成的...

    在上一期图解 图解MySQL | MySQL DDL为什么成本高?中,我们介绍了: 传统情况下,为表添加列需要对表进行重建 腾讯团队为 MySQL 引入了 Instant Add Column 的方案 ...

  4. mysql新增字段位置_图解MySQL | [原理解析] MySQL 为表添加列 是怎么quot;立刻quot;完成的...

    在上一期图解 图解MySQL | MySQL DDL为什么成本高?中,我们介绍了: 传统情况下,为表添加列需要对表进行重建 腾讯团队为 MySQL 引入了 Instant Add Column 的方案 ...

  5. log解析工具 px4_详解MySQL Binlog解析工具--binlog2sql,基于表级别的数据恢复

    概述 最近碰到某个表需要做数据回退,如果回退整个数据库动作又太大,所以用了binlog2sql来实现,这里先介绍一下binlog2sql的相关内容. binlog2sql是一个开源的Python开发的 ...

  6. MySQL Binlog 解析工具 Maxwell 详解

    maxwell 简介 Maxwell是一个能实时读取MySQL二进制日志binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Kinesis.RabbitMQ.Redis.Goog ...

  7. 5.7.24mysql 配置安卓,安卓按键精灵连接MySQL全面解析Windows下安装 mysql5.7的方法

    关于在windows下安装mysql 5.7 •要注意的新坑: 5.7版本安装后ROOT账号是有默认的密码的,这个密码在windows下可以在mysql.ini配置文件指定的data文件夹下面,那个为 ...

  8. Mysql原理解析 - 索引文件的存储结构

    Mysql原理解析 - 索引文件的存储结构 前言 局部性原理 磁盘预读 索引是什么? 1. MSQL为什么索引选择B+树? 1.1 哈希表hash 简介: 局限性: 1.2 二叉树 简介: 局限性: ...

  9. 【MySQL原理解析】01. 一条SQL查询语句是如何执行的

    这是[MySQL原理解析]的第一篇文章,MySQL我看了很多的书与教程,对其原理有一定的理解,一直想写一系列的文章来把MySQL的原理给讲清楚,一直没有时间写,今天算是个开头吧.万事开头难,咱们先破了 ...

  10. MySQL Cluster 群集安装环境介绍

    MySQL Cluster 群集安装环境介绍 MySQL 群集支持的操作系统: * Linux (Red Hat, Novell/SUSE) * Sun Solaris * IBM AIX * HP- ...

最新文章

  1. bert中文预训练模型_[中文医疗预训练模型] MC-BERT
  2. 线段树专辑——hdu 1698 Just a Hook
  3. Express engine 学习笔记 - 工作在反向代理背后的 Express 设置
  4. Sublime Text怎么快速建立一个html5页面模板
  5. 动态更改屏幕方向LANDSCAPE与PORTRAIT 转
  6. 微软正式发布Azure IoT Central
  7. 【POJ - 2632】Crashing Robots(模拟)
  8. input type=submit 和button的区别及表单提交
  9. linux操作系统桌面应用与管理第2版,linux操作系统桌面应用与管理(62页)-原创力文档...
  10. Jmeter 分布式测试完整实践过程(部署成功)
  11. 【oracle】除数为0
  12. 是什么浪费了运维的工作时间?
  13. css基础知识汇总4
  14. Kali linux 渗透测试(五)——渗透WPS攻击
  15. ubuntu安装文泉驿字体
  16. POJ 1035 拼写检查
  17. android 手机投屏电视,手机投屏到智能电视上的几种方法
  18. 迁移学习基础知识整理
  19. 用Python完成 “Excel合并(拆分)” 的各种自动化操作!
  20. [转]我的IT学习生活(搜藏)

热门文章

  1. Binary Tree Paths(leetcode 257)
  2. php resultful接口,来自REST ful PHP服务器的完整日历事件
  3. QT表格QTableWidget在win10下纵横表头无分隔线的问题
  4. std::thread
  5. MySQL 入门(一)—— 常用数据库介绍
  6. 总结一些常用的C语言学习网站
  7. ftfind 桌面搜索引擎的设计文档 (2)
  8. Ignition Vision基本操作
  9. fckeditor在线编辑器
  10. 离散数学1 命题逻辑-基本的概念