Compilers Flex & Bison 的安裝使用 Chang Chi-Chung 2011.03.31
安裝流程圖 MinGW 為 Minimalist GNU for Windows 的簡稱,是 GCC for Windows 的版本,提供有 C、C++、ADA、Fortran 等語言。 wxDevC++ 是以 MinGW 為編譯基礎的 IDE 整合發展環境。 可以依照需求,決定安裝MinGW 或 wxDevC++。喜歡透過命令列編譯的,可以裝 MinGW,想要用整合發展環境的可以裝 wxDevC++。 安裝 MinGW 或 wxDev-CPP 安裝 Flex Flex 是語彙分析器的產生器,只要依照 Flex 的規定,撰寫 Token 的 Pattern (以RE表示),透過 Flex 就可以產生語彙分析器的程式碼(C或 C++) 安裝 Bison Bison 是語法分析器的產生器,是Yacc的改進版本,只要依照 Bison 的規定,撰寫語法規則 ,透過 Bison 就可以產生語法分析器的程式碼(C或 C++),Bison可以和 Flex 合作。 執行範例檔案 (2個)
Step 1: 安裝 C/C++ 編譯器 本步驟可以選擇安裝 MinGW 或 wxDevC++。 ※ wxDevC++ 下載網址: http://wxdsgn.sourceforge.net/ 想要裝 MinGW 的同學請參閱 Step 1-1的投影片
Step 1: 安裝 C/C++ 編譯器 1.請依照安裝指示安裝,安裝路徑可以不用修改。預設路徑為 C:\Program Files\Dev-Cpp 2.下面這個步驟,若選擇「是」,會從網路下載最新的套件,安裝時間較久,建議按「否」。
Step 1: 安裝 C/C++ 編譯器 安裝後第一次啟動設定,請依照下圖的選項設定,其餘設定用預設值即可。
設定環境變數 請在「我的電腦」的圖示上,按右鍵選取「內容」 在變數值後面加入 C:\Program Files\Dev-CPP\bin; 這裡的路徑應該跟安裝時路徑一致。
Step 1-1: 安裝 MinGW 若已經安裝了wxDevC++,就不需要安裝 MinGW ※ MinGW 下載網址: http://www.mingw.org/
Step 1-1: 安裝 MinGW 直接執行,就可以完成安裝 MinGW。 1.依然要設定環境變數,就是安裝目錄中的 bin資料夾。 2.採取此方案的同學,之後只能透過命令列模式編譯程式。
Step 2: 下載 Flex 網址: http://gnuwin32.sourceforge.net/packages/flex.htm
Step 2: 安裝 Flex 安裝選項,選取預設值即可。安裝路徑不須更改。
Step 3: 下載 Bison 網址: http://gnuwin32.sourceforge.net/packages/bison.htm
Step 3: 安裝 Bison 安裝選項,選取預設值即可。安裝路徑不須更改(應該跟 Flex一樣)。
Step 4: 設定環境變數 請在「我的電腦」的圖示上,按右鍵選取「內容」 在變數值後面加入 C:\Program Files\GnuWin32\bin; 這裡的路徑應該跟安裝時路徑一致。
Step 4: 複製連結程式庫 選取 C:\Program Files\GnuWin32\lib 所有檔案(3個),複製到 C:\Program Files\Dev-CPP\lib
測試安裝結果 執行「命令提示字元」 請分別下達 右圖為正確執行結果,表示安裝無誤。 gcc –v (注意 V 小寫) flex –V bison –V 右圖為正確執行結果,表示安裝無誤。
使用 Flex(1) 請先下載範例檔案,解壓縮後有二個資料夾,(建議放置於根目錄下較方便) 請啟動「命令提示字元」,利用命令 下達命令 Example1 Example2 請啟動「命令提示字元」,利用命令 CD C:\Flex\Example1 (紅字部分請依據實際放置位置修改) 下達命令 flex example1.flex (執行後,會產生一個檔案 lex.yy.c )
使用 Flex(2) 1.執行 wxDevC++ 2.「檔案」「開新檔案」「專案」 3.新專案設定值,請見圖。
使用 Flex(3) 1. 專案所在資料夾,請設定到 C:\Flex\Example1 (範例檔所在位置),比較方便 2.專案出現後,請點選 main.c,按右鍵,選擇移除檔案。
使用 Flex(4) 1.點選專案 Ex1,按右鍵,選擇「將檔案加入專案」 2.將Flex產生的 lex.yy.c 加入
使用 Flex(5) 為能夠讓程式編譯後,連結器能夠連結函式庫,須設定Flex 函式庫所在位置,方法如下: 1.點選「專案」「專案選項」 2.點選「額外命令列選項」「新增函式庫或Obj檔」 選擇 C:\Program Files\Dev-Cpp\lib\libfl.a
使用 Flex(6) 1. 請點選「執行」 「編譯」,執行檔會產生在專案資料夾下的.\Output\MingW,檔名為專案名稱 Ex1.exe 2.請將 example1 資料夾下的測試檔 TestData.txt 複製到執行檔的資料夾下。 3.執行「命令提示字元」,切換到執行檔所在資料夾,下達命令 Ex1 < TestData.txt
命令列提示字元,一氣呵成 喜歡全手動,懶得啟動 wxDevC++ IDE 整合發展環境的同學,可以參考下面的全手動方式(哈哈,高手高手)。 執行命令列提示字元,切換到 Example1 的資料夾。 在命令提示字元下達命令 flex example1.flex gcc lex.yy.c –o Ex1.exe –lfl (紅字均為英文字母 L的小寫) Ex1.exe < TestData.txt
Example1 的程式說明 在 Example1 中,我們寫了一個簡單的 Flex程式,這個程式可以將輸入的資料檔,其中的數字過濾並顯示出來,其他的字元則一律捨棄。 請仔細觀察兩個檔案 Example1.flex TestData.txt 請自己隨意產生另一個測試檔,再次執行 ex1 < TestData2.txt (TestData2.txt 是你自己產生的檔案)
Example1.flex & TestData.txt 的內容 %{ #include <stdio.h> %} %% [0-9]+ { printf(“%s\n”, yytext); } .|\n { } %% int main(int argc, char *argv[]) { yylex(); return 0; } 執行結果 123 456 789 99 05 TestData.txt 請仔細觀察好好研究 123 456 789 Today is a good day to die. 99.05.05
練習 Example2的部份,請自行依據投影片練習。 下次上課,我會問的問題 Example2 的 flex 程式的作用為何? 變數 nl, wd, ch 分別代表什麼意義? 提示:\t 代表 Tab 字元。