Flex-Bison是一套很好很方便的工具,但是主要基于Linux,對于我這種喜(懶)歡(于)使(學(xué))用(習(xí)) Windows(Linux)的主,希望能夠在windows環(huán)境中使用這套工具。所幸,國外的大佬們提供了Windows環(huán)境下可以使用的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”(本文以此為例。并且注意:請?jiān)诮鈮旱穆窂街袆e帶中文或帶空格的目錄,以免發(fā)生意外情況)??梢圆榭匆幌履夸浿械膬?nèi)容,如圖 2所示。

二、安裝完畢后添加環(huán)境變量
在系統(tǒng)環(huán)境變量Path中添加“C:\win_flex_bison”,以便能夠直接訪問win_bison.exe和win_flex.exe。添加完畢后可以通過cmd在非安裝目錄中測試一下,即在命令提示符下(任意目錄下)鍵入:“win-bison.exe -V”,如果能夠出現(xiàn)如圖 3所示的bison的版本信息說明環(huán)境變量添加成功。

三、Visual Studio下的配置
本文使用的Visual Studio(VS)是2012版本,其他版本(不低于2010)的應(yīng)該都可以。另外,文本的做法來自于網(wǎng)站的文章(這里我主要起搬運(yùn)工的作用):
https://sourceforge.net/p/winflexbison/wiki/Visual%20Studio%20custom%20build%20rules/
下面是具體的配置過程。
1、打開Visual Studio 2012,建立Win32控制臺項(xiàng)目。
通過菜單的“文件→新建→項(xiàng)目”,在彈出的對話框中選擇模板下的Visual C++中的Win32控制臺應(yīng)用程序工程(如圖 4所示),名稱內(nèi)填寫“TestFlexBison”(你可以任意起名),點(diǎn)擊“確定”,之后在“應(yīng)用程序設(shè)置”中附加選項(xiàng)勾選“空項(xiàng)目”,如圖 5所示,點(diǎn)擊完成。


2、VisualStudio中配置MSBuild規(guī)則
MSBuild配置后方便在VisualStdio中使用win_flex和win_bison工具。配置的參考網(wǎng)址:
https://docs.microsoft.com/zh-cn/visualstudio/msbuild/msbuild?view=vs-2017
首先,右鍵右鍵點(diǎn)擊工程在彈出的菜單中選擇“生成自定義”,見圖 6。

在點(diǎn)擊后會彈出相關(guān)的窗口,如圖 7所示。

之后在彈出的文件選擇框中選擇之前Win flex-bison的安裝目錄“C:\win_flex_bison”下的custom_build_rules子目錄下的子目錄win_flex_bison下的win_flex_bison_custom_build.targets文件。

選擇打開,之后的是否添加搜索路徑對話框中選擇“是”,如圖 9所示。

勾選新添加了build項(xiàng),點(diǎn)擊確定,如圖 10所示。

3、查看相關(guān)屬性
完成上述工作之后,右鍵點(diǎn)擊項(xiàng)目,在彈出的菜單中選擇屬性,如圖 11所示。

可以發(fā)現(xiàn)配置屬性中增加了Bison files和Flex files的配置項(xiàng)(注意,工程中需要有.l和.y文件,否則不顯示的),如圖12所示。你可以根據(jù)需要在Visual Studio中進(jìn)一步進(jìn)行配置(不在本文所述范圍內(nèi))。

4、設(shè)置輸出信息的級別
最后,在工具→選項(xiàng)對話框的項(xiàng)目和解決方案中的生成并運(yùn)行中的MSBuild項(xiàng)目生成輸出詳細(xì)信息的下拉菜單中選擇普通(缺省是最?。?,如圖13所示。這樣就能看到當(dāng)bison(.y)或flex(.l)文件存在錯(cuò)誤時(shí),處理過程中給出詳細(xì)的錯(cuò)誤信息,方便你進(jìn)行調(diào)試。

至此,Visual Studio2012中的配置就完成了,你可以向項(xiàng)目中添加你的flex文件和bison文件,配合其他工程文件去完成你自己的工作了。針對Visual Studio的配置已經(jīng)完成,主要是搬運(yùn)前面鏈接中的內(nèi)容。
四、CodeBlocks下的配置
CodeBlocks下的配置如果比較了解編譯過程,經(jīng)常寫makefile的人會感覺比較方便(我是后反勁,我從來不寫makefile,所以我喜歡使用集成IDE),并且有了前面Visual Studio下的配置打底,應(yīng)該沒有啥問題。
1、安裝CodeBlocks工具
這個(gè)沒啥好說的,網(wǎng)上有很多搬運(yùn)工,直接參考即可,但需要注意,CodeBlocks的安裝目錄也最好保證里面不要出現(xiàn)“空格”、“中文字符”,其實(shí)主要保證的是MinGW里面的g++等工具的正常使用,避免一些麻煩,畢竟是從Linux遷移到Windows中,難保有些地方水土不服。不過本人的CodeBlocks就按照在“C:\Program Files (x86)\CodeBlocks”下,貌似這里也沒有出問題,也正常使用(但是VSCode里配置其他任務(wù)時(shí)存在問題)。啟動CodeBlocks,界面如圖 14所示。

2、配置Compiler
在菜單中選擇“Settings->Compiler…”,進(jìn)行Compiler的相關(guān)配置,彈出相關(guān)配置compiler的對話框圖 15,如圖所示。

在對話框的選項(xiàng)卡中(往右選),選擇“Other settings”,在里面選擇“Advanced options”,如圖 16所示。

點(diǎn)擊后會彈出一個(gè)對話框,主要是怕我們隨意修改compiler的編譯選項(xiàng),如圖 17所示。由于我們就是要修改,所以選擇“Yes”。

之后,會彈出“Advanced compiler options”對話框,如圖 18所示。里面有很多命令的宏,讀者可以仔細(xì)閱讀一下,記錄一下,這樣對我們的后繼操作有很大幫助,這點(diǎn)CodeBlocks還是真挺靠譜的。說實(shí)話,通過這次配置,直接讓我對CodeBlocks路轉(zhuǎn)粉,一點(diǎn)都不夸張。在這里可以對編譯器等相關(guān)工具直接進(jìn)行高級的配置,我們接下來要針對.l和.y進(jìn)行配置。

3、針對.l的配置
在Source ext.的下拉框中選擇l,表示將針對flex文件進(jìn)行配置,如圖 19所示,選擇后下面的Command line macro下面的編輯框中會顯示利用flex命令對.l文件進(jìn)行處理的命令行(命令及命令參數(shù))。由于CodeBlocks使用的是移植自Linux的MinGW,所以其缺省的命令還是Linux下使用flex的命令?,F(xiàn)在我們需要更新為:“win_flex -o$file_dir/$file_name.flex.cpp --wincompat $file”,其中“$file_dir/$file_name.flex.cpp”是要生成的cpp文件的目錄+文件名稱。你可以根據(jù)你的需要選擇由flex生成的文件是什么名字。相應(yīng)的在Generated files的編輯框中同樣修改為“$file_dir/$file_name.flex.cpp”,和前面的生成一致,這樣能夠讓CodeBlocks找到生成的文件進(jìn)行編譯處理。這樣.l的配置就完成了,接下來是.y的配置。

4、針對.y的配置
同.l的配置類似,如圖 20所示,同樣在Source ext.的下拉菜單中選擇y,進(jìn)入.y文件的相關(guān)配置中,替換原來的配置項(xiàng)為:
“win_bison --output=$file_dir/$file_name.tab.cpp --defines=$file_dir/$file_name.tab.h $file”(具體可以參考win_bison的幫助,通過win_bison --help)。相應(yīng)Generate files也修改為“$file_dir/$file_name.tab.cpp” 和“$file_dir/$file_name.tab.h”。之后點(diǎn)擊OK即完成配置,這樣你就可以添加你的.y和.l到你的工程中了。

5,特別注意:如果已經(jīng)有工程了,那么在配置后請一定重啟CodeBlocks之后再Bulid工程,否則CodeBlocks還會按修改配置之前的配置進(jìn)行Build。
五、補(bǔ)充說明
之所以是配置.l的生成文件為$file_name.flex.cpp,而.y的生成文件是$file_name.tab.h和$file_name.tab.cpp,完全是因?yàn)閰⒖剂薟in flex_bison這個(gè)軟件包中針對Visual Studio的設(shè)置。你完全可以指定為自己想要的文件名稱($file_name.scanner.cc,$file_name.parser.hh或$file_name.parser.cc等等),不過在工程中的其他文件中引用生成文件的頭文件時(shí),還請進(jìn)行相應(yīng)的修改。
本配置針對的是C版的flex和bison,但是集成在C++工程中使用的話(本人已經(jīng)實(shí)現(xiàn)過較大的工程),目前沒有發(fā)現(xiàn)啥致命的問題。由于C版的目前足夠使用(聽說有專門為針對C++的),故沒有研究C++版的。
按理說,flex和bison應(yīng)該是很常用的工具,但是這方面的資料好像比較少,特別是Windows下,有也大多都是搬運(yùn)工,并且里面的細(xì)節(jié)也是比較的含糊,簡直就是不想讓你看清楚。難道是大家都是在Linux下使用?本文提供一份Windows下的解決方案,希望能夠幫助那些想用flex和bison但又不熟(想)悉(學(xué))Linux的人。
Linux,不學(xué)不行嗎?
轉(zhuǎn)載請注明出處,否則不太好哇?