Flex&Bison使用教程

上传人:人*** 文档编号:491292919 上传时间:2023-10-18 格式:DOC 页数:20 大小:58.01KB
返回 下载 相关 举报
Flex&Bison使用教程_第1页
第1页 / 共20页
Flex&Bison使用教程_第2页
第2页 / 共20页
Flex&Bison使用教程_第3页
第3页 / 共20页
Flex&Bison使用教程_第4页
第4页 / 共20页
Flex&Bison使用教程_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《Flex&Bison使用教程》由会员分享,可在线阅读,更多相关《Flex&Bison使用教程(20页珍藏版)》请在金锄头文库上搜索。

1、Flex & Bison 使用教程使用说明 本文需要读者对C语言有一定的了解作为基础 本文中所涉及的例子可以用本站提供的全自动化Makefile一文中提供的Makefile进行编译 读者如果在Linux下,可以直接使用,Windows用户需要Cygwin()环境 本文中的工具,需要用户安装flex和bison软件包 1.介绍编译器是软件开发中的核心部件,其作用是其他任何软件所不能取代的。编译器在工作过程中,往往完成如下的任务: 1. 读取源代码并且获得程序的结构描述 2. 分析程序结构,并且生成相应的目标代码 在UNIX早期时代,编写一个编译器是一件非常耗时的工作。人们为了简化开发过程,开发了

2、Lex和YACC程序来解决第一个任务,根据用户描述的语言,生成能够解决问题的C/C+语言代码,供开发者使用。 1. 将源代码文件分解为各种词汇(Lex) 2. 找到这些词汇的组成方式(YACC) GNU软件协会开发了Flex和BISON,其功能与LEX和YACC基本兼容,并且在Lex和YACC提供的功能的基础上进行了各种扩展。 2.Flex入门Lex能够用来编写那些输入数据流(字符串)能够用正则表达式描述的程序,它可以根据正则表达式的描述,将输入数据流分类为各类词汇,为后来的语法分析做准备。 2.1.正则表达式正则表达式是通过对各种词组类型所包含的字符类型的归纳,描述所需词组组成格式的方法,比

3、如下面的例子描述了所有数字类型的字符串,表明无论在何时起,只要有0-9字符出现,就进入该状态,说明是字符,直到非0-9字符结束: 0123456789+为了简化书写起见,也可以写成如下的格式: 0-9+对于任意单词,其中只能包含字母,所以单词的正则表达式为: a-zA-Z+Flex支持如下类型的正则表达式: x 符合字符串x. 除了换行以外的任何字符xyz 一个字符类,在这个例子中,输入必须符合要么是x要么是y要么是zabj-oZ 一个带范围的字符类,符合任何满足a, b, 从j到o还有ZA-Z 一个取反的字符类,比如任何字母除了大写字母。 A-Zn 任何字符除了大写字母和换行r* 零个或更多

4、r,r可以是任意正则表达式r+ 一个或更多rr? 零个或最多一个rr2,5 任何2到5个rr2, 2个或更多rr4 正好4个rname 对name的扩展xyzfoo 符合正则表达式 xyzfoo 的字符串X 如果X是一个a, b, f, n, r, t, 或者v, 则按照ASCII码x转义符进行处理,否则,其他的X将用来做取消处理符处理0 一个ASCII码空字符123 内容为八进制123的char型x2a 内容为十六进制0x2a的char型(r) 符合一个r,括号是用来越过优先级的rs 正则表达式r,紧跟着一个r|s 要么是r要么是sr 一个r,但是必须是在一行的开始r$ 一个r,但是必须是在

5、行末r 一个r,但是之前字符串必须符合条件sr 同上,但是必须之前字符串符合s1或者s2或者s3r 不考虑开始字符串类型,只符合r 文件末尾 前面符合s1或者s2的文件末尾2.2.第一个Lex代码按照上一节我们讲述的正则表达式例子,我们尝试第一次使用Lex来产生我们所需要的程序,实践一遍Lex的使用以及gcc编译器如何编译和生成所需的二进制。 Flex甚至Bison代码都有如下的编写格式: /* 定义段 */%/* Flex、Bison代码段(规则) */%/* 辅助代码段,C语言 */首先,使用vi编译器,输入以下代码(test.l): / 定义段代码% / 这种括号说明内部的代码不许fle

6、x处理,直接进入.C文件#include %/ 词法规则段代码0123456789+ printf(NUMBER); / 数字类型字符串a-zA-Z+ printf(WO); / 单词类型字符串(WORD) printf(RD); %/ 辅助C语言函数代码(直接写C语言,无须括号,我们这里无内容)下面我们首先使用lex程序生成所需的状态机代码: flex -otest.c test.l # 从正则表达式声称对应的C语言代码,注意-o后不要有空格(flex bug?)gcc test.c -o test -lfl # 从C语言代码生成二进制,从而运行,-lfl说明链接libfl.a库文件./te

7、st # 运行刚刚生成的二进制下面我们来对刚生成的二进制进行试验,以弄清楚flex到底是做什么的,在test程序中输入以下内容,按下Ctrl-D可以退出test程序: 3505hellowhat is 3505通过这些试验,相信您已经明白了Flex的用途,每当一个正则表达式符合时,flex生成的代码就会自动调用对应的函数,或者运行对应的程序。下面我们对这个例子进行一些深入研究,处理一个类似C语言的程序配置脚本代码。首先,一个演示脚本如下: logging category lame-servers null; ; category cname null; ;zone . type hint;

8、file /etc/bind/db.root;在这个脚本中,我们可以看到一系列的词汇类型: 单词(WORD),比如zone, type 文件名(FILENAME),比如/etc/bind/db.root 引号(QUOTE),比如文件名两边的 左花括号(OBRACE), 右花括号(EBRACE), 分号(SEMICOLON),; 我们修改后的Lex代码如下: %#include %a-zA-Za-zA-Z0-9* printf(WORD ); /* 字符串 */a-zA-Z0-9/.-+ printf(FILENAME ); /* 文件名 */ printf(QUOTE ); /* 引号 */

9、printf(OBRACE ); /* 左花括号 */ printf(EBRACE ); /* 右花括号 */; printf(SEMICOLON ); /* 分号 */n printf(n); /* 换行 */ t+ /* 忽略空白字符 */%int yywrap(void) /* 当词法分析器到了文件末尾做什么 */ return 1; /* 返回1,说明停止前进,0则继续 */void yyerror(char *s) /* 错误信息打印函数 */ fprintf(stderr, %sn, s); return 0;int main(int argc, char *argv) FILE

10、*fp; fp = fopen(argv1, r); /* 首先打开要被处理的文件(参数1) */ yyin = fp; /* yyin是lex默认的文件输入指针,则不处理控制台输入 */ yylex(); /* 调用lex的工作函数,从这里开始,lex的词法分析器开始工作 */ fclose(fp); return 0;到 这里,我们已经完全可以对一个包含各种类型词组的源代码文件进行分析,得出其中各类型词组的排列顺序。在一个规范的基于语法的源代码中,词组的顺序从一定 意义上来说,就是语法。对于源代码,lex的处理能力也就到这里为止,但是我们并没有完全展示lex的所有功能,读者如果有兴趣,可以

11、继续深入阅读本文提 供的参考文献。如何进行语法分析?我们在下面的章节中讲开始讲述Bison的基本使用方法,以及如何使用Bison进行语法分析。 3.Bison入门3.1.基础理论Bison 采用与YACC相同的描述语言,这种语言是BNF语法(Backus Naur Form)的一种,最早被John Backus和Peter Naur用于ALGOL60语言的开发工作。BNF语法可以用来表达与内容无关的,基于语法的语言,几乎所有的现代编程语言都可以用BNF进行描述。作为 一个例子,一个进行加法和乘法的数学表达式语法可以如下表达: E : E + EE : E * EE : id在这三句中,E在Bi

12、son语言中代表表达式,一个表达式可以是一个数字,也可以是一个变量名称,也可以是几个变量名称的组合,比如: 11+2aa+b*c而以上三句Bison语言就能够表达这些语法结构。 3.2.Bison初探我们在下面作一个计算器,通过这个实例让大家明白Flex和Bison的相互关系和如何共同工作。首先,建立test2ll.l文件,并输入以下内容: /* 计算器的词法分析器描述,Flex语言 */% /* 直接翻译为C语言 */#include /* 包含标准库文件 */void yyerror(char *); /* 这是我们上面用到的错误报告函数 */#include test2yy.h /* 这个头文件由Bison自动生成 */%0-9+ yylval = atoi(yytext); /* yytext是flex内部用于指向当前词汇的字符串指针 */ return INTEGER; /* INTEGER是从test2yy.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号