flex and bison学习笔记01
工作需要,学习一下Flex and bison,以前在编译原理的课上听老师说过他们的前辈,lex and yacc。Flex and bison就是lex and yacc的升级版。
参考书:flex 与 bison
1、Flex and bison简介
Flex和bison是两个用来生成程序的工具,它们生成的程序分别叫做词法分析器和语法分析器,工作中主要是用来生成SQL语句的词法和语法分析器。

2、词法分析器和语法分析器是如何工作的?
任何一种语言,都是有一定的语法规则的,不管是人类的语言,还是计算机语言(如C/C++编程语言等),因此,可以利用这些已知的规则,来对相应的语言进行分析。举个例子,汉语中的一个句子,基本的格式是:主(名词/代词)+谓(动词)+宾(名词/代词),当你在说一句话的时候,我们把你说的话(输入)先拆分成一个个有意义的字或者词组,然后对照该语法,看词性及组合,是否符合既定的语法规范,如果符合,则可以知道你说的话是符合规范的。比如,你说“我吃饭”,输入会被依次拆成“我”“吃”“饭”,它们分别是代词、动词、名词,因此符合上面的语法规则,因此这句话是OK的。而如果说“我饭吃”,则会发现与上面的规范不符合(也没有其他符合的规范),因此这句话语法上市有问题的。Flex和bison生成的词法和语法分析器就是干这两件事的,Flex生成的词法分析器将输入拆分成一个个记号(token),bison生成的语法分析器根据已有的规则,分析这些token的组合,是否符合语法规范。
3、Flex源文件格式
Flex是用来生成词法分析器的
Flex源文件扩展名.l
分为三个段:定义段、规则段、用户子程序段
/* 定义段 */
%{
...
%}
... %%
/* 规则段 */
...
%% /* 用户子程序段 */
... 三个段用%%进行分隔
.定义段
这一部分一般是一些声明及选项设置等。C语言的注释、头文件包含等一般就放在%{%}之间,这一部分的内容会被直接复制到输出文件的开头部分.
.规则段 规则段为一系列匹配模式和动作,模式一般使用正则表达式书写,动作部分为C代码:
模式1 {动作1 (C代码)}
在输入和模式1匹配的时候,执行动作部分的代码。
.用户子程序段 这里为C代码,会被原样复制到输出文件中,一般这里定义一些辅助函数等,如动作代码中使用到的辅助函数。 词法分析器所做的,就是在输入中寻找字符的模式(pattern)。在词法分析器中,我们要给定我们需要识别的模式,因此需要使用一种方式来描述模式,这就是常用的正则表达式。学习正则表达式
4、Flex小例子
1.编写以下Flex源文件(01.l,注意后缀名是l字母)
%{
#include <stdio.h>
%}
%%
[a-zA-Z]+ {printf("get word:%s\n", yytext);}
[-]+ {printf("get number:%d\n", yytext);}
\n {printf("New line\n");}
. {}
%%
代码中定义了四条规则,前面的部分就是模式,处于一行的开始位置,后面部分是动作,也就是,输入中匹配到了这个模式的时候,对应进行什么动作(就像机器人接受到了什么样的指令,然后会执行相应的动作一样)
第一个模式,匹配连续一到多个字符串,匹配之后就将其打印出来。yytext:在输入中匹配到该模式的时候,匹配的部分就存储在这个yytext里面了。这里的动作是把它作为字符串直接输出。
第二个模式,匹配连续一个或者多个数字,匹配到之后就将其输出。
第三个模式,匹配一个换行符,匹配到之后就打印一个新行的信息。
第四个模式,匹配出了\n之外的字符,没有任何动作。
总体来说,这个规则就是匹配到英语单词,则将其输出;匹配到连续数字,则将其输出;匹配到换行符,打印一条信息;匹配到任何其他字符直接忽略({}也就是动作为空,就是什么都不做了。)
源文件写好了之后就是编译、生成可执行程序,然后测试是否按我们所想的那样了。
找一个安装有Flex、bison的机器试一下吧,如果没有自行安装
centos下使用下面命令安装,
yum install flex
yum nistall bison
生成C代码:felx ./01.l
编译生成的C代码:gcc -o scanner ./lex.yy.c -lfl
然后运行scanner程序即可。
第二个小例子的代码:
%{
int chars = ;
int words = ;
int lines = ;
%}
%%
[a-zA-Z]+ {words++; chars += strlen(yytext);}
\n {chars++; lines++;}
. {chars++;}
%%
main(int argc, char **argv)
{
yylex();
printf("lines:%8d\nwords:%8d\nchars:%8d\n", lines, words, chars);
}
这个例子的规则是,统计输入的单词数,字符数以及行数。
flex and bison学习笔记01的更多相关文章
- 软件测试之loadrunner学习笔记-01事务
loadrunner学习笔记-01事务<转载至网络> 事务又称为Transaction,事务是一个点为了衡量某个action的性能,需要在开始和结束位置插入一个范围,定义这样一个事务. 作 ...
- C++ GUI Qt4学习笔记01
C++ GUI Qt4学习笔记01 qtc++signalmakefile文档平台 这一章介绍了如何把基本的C++只是与Qt所提供的功能组合起来创建一些简单的图形用户界面应用程序. 引入两个重要概 ...
- SaToken学习笔记-01
SaToken学习笔记-01 SaToken版本为1.18 如果有排版方面的错误,请查看:传送门 springboot集成 根据官网步骤maven导入依赖 <dependency> < ...
- Redis:学习笔记-01
Redis:学习笔记-01 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 1. Redis入门 2.1 ...
- PHP 学习笔记 01
例子: 为什么要学PHP 主观原因: 前段时间在学校处理了毕业的一些事情,回到上海后开始了找工作的旅程.意向工作是WPF开发或者ASP.NET 作为后端的WEB开发. 陆陆续续一直在面试,其中有一家公 ...
- vue.js 2.0 官方文档学习笔记 —— 01. vue 介绍
这是我的vue.js 2.0的学习笔记,采取了将官方文档中的代码集中到一个文件的形式.目的是保存下来,方便自己查阅. !官方文档:https://cn.vuejs.org/v2/guide/ 01. ...
- xml基础学习笔记01
注意:刚刚看了网上对于XML中的标签,节点和元素?到底应该怎么表述?起初我也有这个疑惑,现在我的想法是:下面出现node的应称作节点,节点对象.element应称作元素,毕竟这更符合英文的本意.至于标 ...
- Ext.Net学习笔记01:在ASP.NET WebForm中使用Ext.Net
Ext.Net是一个对ExtJS进行封装了的.net控件库,可以在ASP.NET WebForm和MVC中使用.从今天开始记录我的学习笔记,这是第一篇,今天学习了如何在WebForm中使用Ext.Ne ...
- FPGA-VHDL课堂学习笔记*01
FPGA-VHDL课堂学习笔记 记录说明:本文档主要记录大学期间,老师FPGA授课课堂笔记. 代码语言:VHDL 编程软件:MAX+plus II FPGA硬件:FLE-843 03月05日 理论课 ...
随机推荐
- [Java基础] java的守护线程与非守护线程
最近重新研究Java基础知识,发现以前太多知识知识略略带过了,比较说Java的线程机制,在Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) ,(PS:以 ...
- (转载)如何学好iphone游戏开发
转自:http://www.cnblogs.com/zilongshanren/archive/2011/09/19/2181558.html 自从发布<如何学习iphone游戏开发>到 ...
- SEO之巴莱多定律
SEO这个词在2007.2008年好像特别的火,尤其在2007年下半年至今,众多SEO爱好者发起了最大的一轮搜索引擎优化研究风暴,甚至最终逼迫百度等大型搜索引擎公司改变算法. SEO,确实能带来一些经 ...
- sqlmap原理及使用方法
1 . 介绍1.1 要求 1.2 网应用情节 1.3 SQL 射入技术 1.4 特点 1.5 下载和更新sqlmap 1.6 执照 2 . 用法2.1 帮助 2.2 目标URL 2.3 目标URL 和 ...
- jTemplates模板学习笔记
1.jTemplates工作方式 1)setTemplateElement:指定可处理的模板对象 2)processTemplate:对模板化的对象进行数据处理 2.语法解析 1)jTempl ...
- Geeks - Check whether a given graph is Bipartite or not 二分图检查
检查一个图是否是二分图的算法 使用的是宽度搜索: 1 初始化一个颜色记录数组 2 利用queue宽度遍历图 3 从随意源点出发.染色0. 或1 4 遍历这点的邻接点.假设没有染色就染色与这个源点相反的 ...
- Java中equals()、equalsIgnoreCase()和==的区别
用久了C#,在Java中,判断一个字符串还是习惯性的用了==,但是总是不能按照正确的判断分支运行,后来才想起来Java中是有equals的,然后就有引出了equalsIgnoreCase. 这三种 ...
- Web开发常见的几个漏洞解决方法
http://www.cnblogs.com/wuhuacong/archive/2013/04/15/3022011.html 如何利用SQL注入漏洞攻破一个WordPress网站 平时工作,多数是 ...
- gcc编译选项汇集
gcc -g 调试选项(DEBUGGING OPTION)GNU CC拥有许多特别选项,既可以调试用户的程序,也可以对GCC排错: -g 以操作系统的本地格式(stabs, COFF, XCOFF,或 ...
- Markdown 语法背一下咯
标题 使用`=`和`-`标记一级和二级标题. # 一级标题 ## 二级标题 使用`#`,可表示1-6级标题. # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标 ...