Flex-Bison是一套很好很方便的工具,但是主要基于Linux,对于我这种喜(懒)欢(于)使(学)用(习) Windows(Linux)的主,希望能够在windows环境中使用这套工具。所幸,国外的大佬们提供了Windows环境下可以使用的Flex-Bison套装:Win flex-bison。
Win-Flex-Bison的下载页面地址:
https://sourceforge.net/projects/winflexbison/postdownload
本文采用的版本是2.5.15,不过好像杀毒软件的对该套装多有误会,本人无法确定是否真有问题,读者慎选。
下载页面如图 1所示:
文本提供两种配置方式:1)针对Visual Studio的用户;2)使用CodeBlocks的用户。其他IDE的暂不提供,但是会了这样种基本就够用了吧?
一、安装Win flex-bison
将Win flex-bison的下载安装包win_flex_bison-2.5.15.zip解压缩到你喜欢的目录,如:“C:\win_flex_bison”(本文以此为例。并且注意:请在解压的路径中别带中文或带空格的目录,以免发生意外情况)。可以查看一下目录中的内容,如图 2所示。
二、安装完毕后添加环境变量
在系统环境变量Path中添加“C:\win_flex_bison”,以便能够直接访问win_bison.exe和win_flex.exe。添加完毕后可以通过cmd在非安装目录中测试一下,即在命令提示符下(任意目录下)键入:“win-bison.exe -V”,如果能够出现如图 3所示的bison的版本信息说明环境变量添加成功。
三、Visual Studio下的配置
本文使用的Visual Studio(VS)是2012版本,其他版本(不低于2010)的应该都可以。另外,文本的做法来自于网站的文章(这里我主要起搬运工的作用):
https://sourceforge.net/p/winflexbison/wiki/Visual%20Studio%20custom%20build%20rules/
下面是具体的配置过程。
1、打开Visual Studio 2012,建立Win32控制台项目。
通过菜单的“文件→新建→项目”,在弹出的对话框中选择模板下的Visual C++中的Win32控制台应用程序工程(如图 4所示),名称内填写“TestFlexBison”(你可以任意起名),点击“确定”,之后在“应用程序设置”中附加选项勾选“空项目”,如图 5所示,点击完成。
2、VisualStudio中配置MSBuild规则
MSBuild配置后方便在VisualStdio中使用win_flex和win_bison工具。配置的参考网址:
https://docs.microsoft.com/zh-cn/visualstudio/msbuild/msbuild?view=vs-2017
首先,右键右键点击工程在弹出的菜单中选择“生成自定义”,见图 6。
在点击后会弹出相关的窗口,如图 7所示。
之后在弹出的文件选择框中选择之前Win flex-bison的安装目录“C:\win_flex_bison”下的custom_build_rules子目录下的子目录win_flex_bison下的win_flex_bison_custom_build.targets文件。
选择打开,之后的是否添加搜索路径对话框中选择“是”,如图 9所示。
勾选新添加了build项,点击确定,如图 10所示。
3、查看相关属性
完成上述工作之后,右键点击项目,在弹出的菜单中选择属性,如图 11所示。
可以发现配置属性中增加了Bison files和Flex files的配置项(注意,工程中需要有.l和.y文件,否则不显示的),如图12所示。你可以根据需要在Visual Studio中进一步进行配置(不在本文所述范围内)。
4、设置输出信息的级别
最后,在工具→选项对话框的项目和解决方案中的生成并运行中的MSBuild项目生成输出详细信息的下拉菜单中选择普通(缺省是最小),如图13所示。这样就能看到当bison(.y)或flex(.l)文件存在错误时,处理过程中给出详细的错误信息,方便你进行调试。
至此,Visual Studio2012中的配置就完成了,你可以向项目中添加你的flex文件和bison文件,配合其他工程文件去完成你自己的工作了。针对Visual Studio的配置已经完成,主要是搬运前面链接中的内容。
四、CodeBlocks下的配置
CodeBlocks下的配置如果比较了解编译过程,经常写makefile的人会感觉比较方便(我是后反劲,我从来不写makefile,所以我喜欢使用集成IDE),并且有了前面Visual Studio下的配置打底,应该没有啥问题。
1、安装CodeBlocks工具
这个没啥好说的,网上有很多搬运工,直接参考即可,但需要注意,CodeBlocks的安装目录也最好保证里面不要出现“空格”、“中文字符”,其实主要保证的是MinGW里面的g++等工具的正常使用,避免一些麻烦,毕竟是从Linux迁移到Windows中,难保有些地方水土不服。不过本人的CodeBlocks就按照在“C:\Program Files (x86)\CodeBlocks”下,貌似这里也没有出问题,也正常使用(但是VSCode里配置其他任务时存在问题)。启动CodeBlocks,界面如图 14所示。
2、配置Compiler
在菜单中选择“Settings->Compiler…”,进行Compiler的相关配置,弹出相关配置compiler的对话框图 15,如图所示。
在对话框的选项卡中(往右选),选择“Other settings”,在里面选择“Advanced options”,如图 16所示。
点击后会弹出一个对话框,主要是怕我们随意修改compiler的编译选项,如图 17所示。由于我们就是要修改,所以选择“Yes”。
之后,会弹出“Advanced compiler options”对话框,如图 18所示。里面有很多命令的宏,读者可以仔细阅读一下,记录一下,这样对我们的后继操作有很大帮助,这点CodeBlocks还是真挺靠谱的。说实话,通过这次配置,直接让我对CodeBlocks路转粉,一点都不夸张。在这里可以对编译器等相关工具直接进行高级的配置,我们接下来要针对.l和.y进行配置。
3、针对.l的配置
在Source ext.的下拉框中选择l,表示将针对flex文件进行配置,如图 19所示,选择后下面的Command line macro下面的编辑框中会显示利用flex命令对.l文件进行处理的命令行(命令及命令参数)。由于CodeBlocks使用的是移植自Linux的MinGW,所以其缺省的命令还是Linux下使用flex的命令。现在我们需要更新为:“win_flex -o$file_dir/$file_name.flex.cpp --wincompat $file”,其中“$file_dir/$file_name.flex.cpp”是要生成的cpp文件的目录+文件名称。你可以根据你的需要选择由flex生成的文件是什么名字。相应的在Generated files的编辑框中同样修改为“$file_dir/$file_name.flex.cpp”,和前面的生成一致,这样能够让CodeBlocks找到生成的文件进行编译处理。这样.l的配置就完成了,接下来是.y的配置。
4、针对.y的配置
同.l的配置类似,如图 20所示,同样在Source ext.的下拉菜单中选择y,进入.y文件的相关配置中,替换原来的配置项为:
“win_bison --output=$file_dir/$file_name.tab.cpp --defines=$file_dir/$file_name.tab.h $file”(具体可以参考win_bison的帮助,通过win_bison --help)。相应Generate files也修改为“$file_dir/$file_name.tab.cpp” 和“$file_dir/$file_name.tab.h”。之后点击OK即完成配置,这样你就可以添加你的.y和.l到你的工程中了。
5,特别注意:如果已经有工程了,那么在配置后请一定重启CodeBlocks之后再Bulid工程,否则CodeBlocks还会按修改配置之前的配置进行Build。
五、补充说明
之所以是配置.l的生成文件为$file_name.flex.cpp,而.y的生成文件是$file_name.tab.h和$file_name.tab.cpp,完全是因为参考了Win flex_bison这个软件包中针对Visual Studio的设置。你完全可以指定为自己想要的文件名称($file_name.scanner.cc,$file_name.parser.hh或$file_name.parser.cc等等),不过在工程中的其他文件中引用生成文件的头文件时,还请进行相应的修改。
本配置针对的是C版的flex和bison,但是集成在C++工程中使用的话(本人已经实现过较大的工程),目前没有发现啥致命的问题。由于C版的目前足够使用(听说有专门为针对C++的),故没有研究C++版的。
按理说,flex和bison应该是很常用的工具,但是这方面的资料好像比较少,特别是Windows下,有也大多都是搬运工,并且里面的细节也是比较的含糊,简直就是不想让你看清楚。难道是大家都是在Linux下使用?本文提供一份Windows下的解决方案,希望能够帮助那些想用flex和bison但又不熟(想)悉(学)Linux的人。
Linux,不学不行吗?
转载请注明出处,否则不太好哇?