YACC&Flex Windows使用开发
2008-05-03 21:21
176 查看
FLex(Fast lexical analyzer generator)是词法分析器的生成器,提供对输入的文本进行分析,匹配指定的词法模式。Lex在使用上很不方便的一点是它是首先在Unix系统上出现的工具,后来成为了GNU的一员,虽然移植到Windows平台,但是使用起来有很多需要注意的地方。
在windows上的使用我使用过Parser Generation、GNUWin32移植版本。在使用Parse Generation使用yacc的时候有一个编译问题怎么也过不了(我使用的是VC6.0+SP),很郁闷。最后放弃,找到GNUWin32的移植版本,可以解决这个编译问题。下载链接http://gnuwin32.sourceforge.net/packages/flex.htm 开始很疑惑的一点是Flex生成的词法分析器并没有包含任何的头文件也没有使用extern声明,那它使用的yylex、yytext函数是从哪里链接过来的。既然不在其他文件中,只能在生成的文件中了,查看生成的词法分析器代码搜索yylex,只搜索到#define YY_DECL int yylex YY_PROTO(( void )),并没有搜索到yylex的定义。后来仔细一看下面有定义 YY_DECL{...},原来如此实际上yylex还是被定义了只是先被宏定义了。仔细观察词法分析器的代码,这其中大量使用了宏定义。yy_scan_string等函数都是由用宏定义组合成的,其中的代码大量使用了很多旧的C语言规范的代码,例如函数的定义YY_BUFFER_STATE yy_scan_string( yy_str ) yyconst char *yy_str;。
对于Flex自动生成的代码,我认为一个很不方便的地方在于它不能生成头文件使得在我们自己的源文件中使用的时候,需要使用extern,如果使用较多可以把extern声明放到同一个文件中。 我们也可以对生成的代码进行一层封装,就在词法分析器的代码中封装,然后自己写一个封装类的头文件。
编译YACC和Flex生成的文件的时候需要注意的一点是YACC 和Flex生成的都是.c后缀的文件,VC编译的时候默认把它们编译成传统C语言调用方式的函数,所以在其他CPP文件中需要调用这些C函数的时候需要加上extern “C",或者干脆把.c后缀改成.cpp。
对于想学习Flex的朋友GNUWin32的移植版本中所带的flex.pdf文档是相当好的资料,资料不长,但是介绍的非常好。
在windows上的使用我使用过Parser Generation、GNUWin32移植版本。在使用Parse Generation使用yacc的时候有一个编译问题怎么也过不了(我使用的是VC6.0+SP),很郁闷。最后放弃,找到GNUWin32的移植版本,可以解决这个编译问题。下载链接http://gnuwin32.sourceforge.net/packages/flex.htm 开始很疑惑的一点是Flex生成的词法分析器并没有包含任何的头文件也没有使用extern声明,那它使用的yylex、yytext函数是从哪里链接过来的。既然不在其他文件中,只能在生成的文件中了,查看生成的词法分析器代码搜索yylex,只搜索到#define YY_DECL int yylex YY_PROTO(( void )),并没有搜索到yylex的定义。后来仔细一看下面有定义 YY_DECL{...},原来如此实际上yylex还是被定义了只是先被宏定义了。仔细观察词法分析器的代码,这其中大量使用了宏定义。yy_scan_string等函数都是由用宏定义组合成的,其中的代码大量使用了很多旧的C语言规范的代码,例如函数的定义YY_BUFFER_STATE yy_scan_string( yy_str ) yyconst char *yy_str;。
对于Flex自动生成的代码,我认为一个很不方便的地方在于它不能生成头文件使得在我们自己的源文件中使用的时候,需要使用extern,如果使用较多可以把extern声明放到同一个文件中。 我们也可以对生成的代码进行一层封装,就在词法分析器的代码中封装,然后自己写一个封装类的头文件。
编译YACC和Flex生成的文件的时候需要注意的一点是YACC 和Flex生成的都是.c后缀的文件,VC编译的时候默认把它们编译成传统C语言调用方式的函数,所以在其他CPP文件中需要调用这些C函数的时候需要加上extern “C",或者干脆把.c后缀改成.cpp。
对于想学习Flex的朋友GNUWin32的移植版本中所带的flex.pdf文档是相当好的资料,资料不长,但是介绍的非常好。
相关文章推荐
- 使用Lex和Yacc开发C语言的编译器
- 【Android开发学习45】使用google语音识别引擎(Google Speech API)<一>
- 【iOS-cocos2d-X 游戏开发之九】Cocos2dx利用CCSAXParser解析xml数据&CCMutableDictionary使用与注意!
- 使用LEX&YACC设计一个计算器的例子
- IE8"开发人员工具"使用详解下(模式,JS调试,探查器)
- iOS开发之获取照片&&TZImagePickerController的使用
- 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取"产品付费数量等于0的问题"】
- 源码-JavaScript&jQuery交互式前端开发-第2章-JavaScript基础指令-使用变量来存储数字
- 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取"产品付费数量等于0的问题"】
- 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取"产品付费数量等于0的问题"】
- iOS开发——网络使用技术OC篇&网络爬虫-使用正则表达式抓取网络数据
- android开发中DatePicker控件的使用-------->时间的设置
- 从lex&yacc说到编译器(2.flex的使用)
- WinForm界面开发之布局控件"WeifenLuo.WinFormsUI.Docking"的使用
- Lex&Yacc使用总结
- IOS开发之格式化日期时间的使用 && 编程中常见问题
- Android 开发中使用 http://zyc-to.blog.163.com/blog/static/1715240020131354535810/?suggestedreading&wumii
- iOS开发示例————使用CAShapeLayer&UIBezierPath绘制数据饼图
- IE8"开发人员工具"使用详解下(浏览器模式、文本模式、JavaScript调试、探查器)
- iOS开发:使用Settings Bundl…