mysql yacc 解析_yacc介绍
在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介绍相关推荐
- mysql源码包结构,mysql源码结构介绍
mysql源码非常庞大,直接去看肯定毫无头绪.至少需要知道哪个目录是做什么的,才能有一定的条理.现在对mysql的源码结构做初步介绍 目录结构 ==来自622463 MySQL运维内参:MySQL.G ...
- MySQL—05—MySQL如何处理SQL语句;MySQL数据库存储引擎介绍;
一. MySQL 中的执行计划 1 MySQL 执行计划 在 MySQL 中可以通过 explain 关键字模拟优化器,执行 SQL 语句,从而知道 MySQL 是 如何处理 SQL 语句的. 2 M ...
- mysql新增列并同时增加数据_图解MySQL | [原理解析] MySQL 为表添加列 是怎么quot;立刻quot;完成的...
在上一期图解 图解MySQL | MySQL DDL为什么成本高?中,我们介绍了: 传统情况下,为表添加列需要对表进行重建 腾讯团队为 MySQL 引入了 Instant Add Column 的方案 ...
- mysql新增字段位置_图解MySQL | [原理解析] MySQL 为表添加列 是怎么quot;立刻quot;完成的...
在上一期图解 图解MySQL | MySQL DDL为什么成本高?中,我们介绍了: 传统情况下,为表添加列需要对表进行重建 腾讯团队为 MySQL 引入了 Instant Add Column 的方案 ...
- log解析工具 px4_详解MySQL Binlog解析工具--binlog2sql,基于表级别的数据恢复
概述 最近碰到某个表需要做数据回退,如果回退整个数据库动作又太大,所以用了binlog2sql来实现,这里先介绍一下binlog2sql的相关内容. binlog2sql是一个开源的Python开发的 ...
- MySQL Binlog 解析工具 Maxwell 详解
maxwell 简介 Maxwell是一个能实时读取MySQL二进制日志binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Kinesis.RabbitMQ.Redis.Goog ...
- 5.7.24mysql 配置安卓,安卓按键精灵连接MySQL全面解析Windows下安装 mysql5.7的方法
关于在windows下安装mysql 5.7 •要注意的新坑: 5.7版本安装后ROOT账号是有默认的密码的,这个密码在windows下可以在mysql.ini配置文件指定的data文件夹下面,那个为 ...
- Mysql原理解析 - 索引文件的存储结构
Mysql原理解析 - 索引文件的存储结构 前言 局部性原理 磁盘预读 索引是什么? 1. MSQL为什么索引选择B+树? 1.1 哈希表hash 简介: 局限性: 1.2 二叉树 简介: 局限性: ...
- 【MySQL原理解析】01. 一条SQL查询语句是如何执行的
这是[MySQL原理解析]的第一篇文章,MySQL我看了很多的书与教程,对其原理有一定的理解,一直想写一系列的文章来把MySQL的原理给讲清楚,一直没有时间写,今天算是个开头吧.万事开头难,咱们先破了 ...
- MySQL Cluster 群集安装环境介绍
MySQL Cluster 群集安装环境介绍 MySQL 群集支持的操作系统: * Linux (Red Hat, Novell/SUSE) * Sun Solaris * IBM AIX * HP- ...
最新文章
- bert中文预训练模型_[中文医疗预训练模型] MC-BERT
- 线段树专辑——hdu 1698 Just a Hook
- Express engine 学习笔记 - 工作在反向代理背后的 Express 设置
- Sublime Text怎么快速建立一个html5页面模板
- 动态更改屏幕方向LANDSCAPE与PORTRAIT 转
- 微软正式发布Azure IoT Central
- 【POJ - 2632】Crashing Robots(模拟)
- input type=submit 和button的区别及表单提交
- linux操作系统桌面应用与管理第2版,linux操作系统桌面应用与管理(62页)-原创力文档...
- Jmeter 分布式测试完整实践过程(部署成功)
- 【oracle】除数为0
- 是什么浪费了运维的工作时间?
- css基础知识汇总4
- Kali linux 渗透测试(五)——渗透WPS攻击
- ubuntu安装文泉驿字体
- POJ 1035 拼写检查
- android 手机投屏电视,手机投屏到智能电视上的几种方法
- 迁移学习基础知识整理
- 用Python完成 “Excel合并(拆分)” 的各种自动化操作!
- [转]我的IT学习生活(搜藏)