在windows下面使用flex和bison编写文件解析器

本文的目的是介绍如何解决在windows下使用flex和bison编写文件解析器的一些问题, 我水平不高,对与flex,bison,gnu linux也没有什么深刻的理解,只是觉得对于这方 面的具体的问题好像没有人提及,所以把自己在使用过程中遇到的问题和解决问题的方 法写出来,让大家以后遇到这样的问题不会浪费自己宝贵的时间。

一、简介:

1、flex(fast lexical analyzer generator ) flex是gnu的lex工具,可以用来生成文字扫描程序(scanner),我们可以在 GitHub - westes/flex: The Fast Lexical Analyzer - scanner generator for lexing in C and C++ 得到关于flex的更详尽的信息。

如果感兴趣的话也可以在 ftp://ftp.gnu.org/non-gnu/flex/ 找到最新的flex源程序(里面包括了for winnt的makefile,可以尝试编译一个windows 下面的flex)

2、bison bison也是gnu的工具,功能相当于yacc(这么写也许不准确),可以用来生成解析器程序 (parser),我们 可以在 Bison- GNU Project - Free Software Foundation 得到关于bison的更详尽的信息。如果感兴趣的话也可以在 ftp://ftp.gnu.org/gnu/bison/ 找到最新的bison版本。

flex和bison结合使用可以大大减少写解析器程序的难度。具体的使用可以参考 www-900.ibm.com/developerWorks/ cn/linux/sdk/lex/index.shtml (lex与yacc快速 入门)

二、如何得到在windows下可用的flex和bison

flex和bison整合在linux里面,使用方便,而对于windows是另外一回事情,要得到能在 windows下面使用的flex和bison有以下途径:

1、使用mingw:这里给出几个网址www.mingw.org(mingw的主页) http://sourceforge.net/projects/mingw(sorceforge上面的主页)


如果像我一样没有什么linux的经验最好使用上面提供的一个集成的安装 文件 Download MinGW - Minimalist GNU for Windows from SourceForge.net nload 在mingw下面使用flex和bison非常方便。

2、使用cygwin:这个我没有用过,不过和mingw差不多的说。

3、使用从cygwin中抽出来的flex和bison:这个是某人把flex和bison从cygwin环境中独 立出来得到的,很小,也很好用 www.driverdevelop.com/lu0/App/20040513.html

4、使用gnuwin32:在sourceforge上面的gnuwin32工程里面可以找到在windows下面可用 的flex和bison。flex很好用,不过bison好像有点问题 。给出地址:GnuWin download | SourceForge.net

5、自己编译一个可用的exe文件,flex提供了for nt的makefile,不过我尝试了一下没 有成功,有时间和兴趣的话可以去捣鼓。

三、编写文件遇到的麻烦

按照“lex与yacc快速入门”上面说得东西,并参照flex 手册及bison手册来编写自己的 文件解析器,基本不会遇到什么大问题。需要提一下几点

1、在.y文件中不要按照bison手册提到的那样使用‘’来表示会遇到的标点符号,把所 有的标点符号都定义相应的token,在.y中用定义好的token来表示标点符号。比如说要 写一个c的解析器,那么对于';'',''+'等,就最好在lex文件里里面加入 ';' return SEMI; ',' return COMMA; '+' return PLUS; 在.y文件里面定义SEMI,COMMA,和PLUS为token。

2、.y里面有用的变量yylval,这个变量用来把.y和.l联系起来,.l生成的扫描器程序遇 到了一个token会把这个词放在yytext变量里面,把text付给yylval的话,.y文件生成的 parser就能接受到扫描器遇到的词了。另外yylval默认的类型是char*,我们可以用#def ine YYSTYPE来改变yylval的类型,还可以用%union{....}以及%type...来使yylv al对于不同的toaken有不同的变量类型。

四、编译连接文件会遇到的麻烦

1、在编译.y文件的时候要小心 -p 选项,这个选项会改变yylval以及yylex等一大堆东 西的名字,具体的可以去查阅bison手册。

2、如果没有犯错误的话,注意了上面的这些问题,用flex和bison编写的文件解析程序 在mingw应该可以用gcc编译链接通过,并正常运行。 但是如果你想把程序拿到vc下面去用,问题就出来了。vc会有一个编译错误,并告诉你 在文件lex.yy.c(由flex产生的代码)不能打开。如果你找到这一行,并删掉 的话,就能编译通过但是会在link的时候出错,告诉你unresolved external symbol " int __cdecl isatty(int)"。 造成错误的原因是windows下面没有unistd.h,我在网上找了很久找到了解决办法, 在flex生成的c代码中加入一下几行代替原来的#include就行了

#ifndef _WIN32

#include

#else

#ifndef YY_ALWAYS_INTERACTIVE

#ifndef YY_NEVER_INTERACTIVE

/* extern int isatty YY_PROTO(( int )); */

#include 

#endif

#endif

#endif

你可能感兴趣的:(Windows,windows,linux,服务器)