- 1、本文档共36页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
PAGE/NUMPAGES
FlexBison使用教程
使用说明
本文需要读者对C语言有一定的了解作为基础
本文中所涉和的例子可以用本站提供的‘全自动化Makefile’一文中提供的Makefile进行编译
读者如果在Linux下,可以直接使用,Windows用户需要Cygwin()环境
本文中的工具,需要用户安装flex和bison软件包
1.介绍
编译器是软件开发中的核心部件,其作用是其他任何软件所不能取代的。编译器在工作过程中,往往完成如下的任务:
读取源代码并且获得程序的结构描述
分析程序结构,并且生成相应的目标代码
在UNIX早期时代,编写一个编译器是一件非常耗时的工作。人们为了简化开发过程,开发了Lex和YACC程序来解决第一个任务,根据用户描述的语言,生成能够解决问题的C/C++语言代码,供开发者使用。
将源代码文件分解为各种词汇(Lex)
找到这些词汇的组成方式(YACC)
GNU软件协会开发了Flex和BISON,其功能与LEX和YACC基本兼容,并且在Lex和YACC提供的功能的基础上进行了各种扩展。
2.Flex入门
Lex能够用来编写那些输入数据流(字符串)能够用正则表达式描述的程序,它可以根据正则表达式的描述,将输入数据流分类为各类词汇,为后来的语法分析做准备。
2.1.正则表达式
正则表达式是通过对各种词组类型所包含的字符类型的归纳,描述所需词组组成格式的方法,比如下面的例子描述了所有数字类型的字符串,表明无论在何时起,只要有0-9字符出现,就进入该状态,说明是字符,直到非0-9字符结束:
[0123456789]+
为了简化书写起见,也可以写成如下的格式:
[0-9]+
对于任意单词,其中只能包含字母,所以单词的正则表达式为:
[a-zA-Z]+
Flex支持如下类型的正则表达式:
x?????符合字符串x
.?????除了换行以外的任何字符
[xyz]???一个字符类,在这个例子中,输入必须符合要么是x’要么是y要么是z
[abj-oZ]?一个带范围的字符类,符合任何满足a,b,从j到o还有Z
[^A-Z]??一个取反的字符类,比如任何字母除了大写字母。
[^A-Z\n]?任何字符除了大写字母和换行
r*????零个或更多r,r可以是任意正则表达式
r+????一个或更多r
r?????零个或最多一个r
r{2,5}??任何2到5个r
r{2,}???2个或更多r
r{4}???正好4个r
{name}??对name的扩展
[xyz]\foo
??????符合正则表达式[xyz]foo的字符串
\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要么是s
^r????一个r,但是必须是在一行的开始
r$????一个r,但是必须是在行末
sr???一个r,但是之前字符串必须符合条件s
s1,s2,s3r
??????同上,但是必须之前字符串符合s1或者s2或者s3
*r???不考虑开始字符串类型,只符合r
EOF??文件末尾
s1,s2EOF
??????前面符合s1或者s2的文件末尾
2.2.第一个Lex代码
按照上一节我们讲述的正则表达式例子,我们尝试第一次使用Lex来产生我们所需要的程序,实践一遍Lex的使用以和gcc编译器如何编译和生成所需的二进制。Flex甚至Bison代码都有如下的编写格式:
/*定义段*/
%%
/*Flex、Bison代码段(规则)*/
%%
/*辅助代码段,C语言*/
首先,使用vi编译器,输入以下代码(test.l):
//定义段代码
%{?????????????????//这种括号说明内部的代码不许flex处理,直接进入.C文件
#includestdio.h
%}
%%
//词法规则段代码
[0123456789]+??printf(NUMBER);?//数字类型字符串
[a-zA-Z]+????{
??????????printf(
文档评论(0)