由于flex往往為我們生成的是C代碼(lex.yy.c),而實際上我們通常要把它們應用到C++中,特別是應用到Windows應用程序中來,在MFC工程下構造詞法分析程序。
我們往往只是將產生的lex.yy.c直接添加到MFC工程就完事,但是編譯時,由于各種各樣的原因,而產生大量的語法錯誤,難以修改。本人最近在MFC下構造一個擴充TINY語言的詞法分析也是遇到了一些問題,查閱了大量資料(已經將主要的參考資料放到lex學習欄目上,請看:http://www.shnenglu.com/Plator/category/7159.html),耗費了我兩天的時間解決這些問題。因此我想寫本文,將把一些注意問題敘述如下,希望對一些朋友有所幫助。
1. 要將lex.yy.c改為CPP文件:lex.yy.cpp。因為MFC是C++工程,若不修改則會出現錯誤;
2. 將#include <stdio.h>改為#include <stdafx.h>,不然會出現如下錯誤:unexpected end of file while looking for precompiled header directive;
3. 將flex安裝目錄下include文件夾的unistd.h添加到MFC工程內,并修改#include <unistd.h>,為#include "unistd.h"。因為unistd.h文件中定義了詞法分析需要用到一些頭文件。
4. 如果lex源文件需要用input讀取字符,則應該換用yyinput,因為input會與C++中的流名詞重復,會出現編譯錯誤;
5. 注意一些I/O例程的應用,具體請見:http://www.shnenglu.com/Plator/archive/2008/05/24/50940.html
只是短短幾個錯誤,但是解決的過程參考了大量資料,雖然不知道這些資料出自何人之手,但是在此感謝這些作者!