YACC&Flex Windows使用开发

本文介绍了如何在Windows环境下使用Flex(Fast lexical analyzer generator)和YACC进行词法和语法分析器的开发。重点讨论了在Windows上遇到的编译问题,如在VC6.0中使用Parser Generation的困难,以及转向GNUWin32移植版的解决方案。Flex生成的词法分析器代码使用宏定义实现,包括yylex函数。为了解决头文件和extern声明的问题,作者建议对生成的代码进行封装。同时,提醒在编译C文件时注意extern "C"的使用,以便在C++项目中调用。最后,推荐了GNUWin32中提供的flex.pdf文档作为学习资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    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文档是相当好的资料,资料不长,但是介绍的非常好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值