Qt專案整合Lex Yacc的方法

2021-06-22 06:30:45 字數 2414 閱讀 4925

最近專案中要用到lex/yacc,所以整理了乙個qt creator中整合lex/yacc的方法。

準備工作完成,先上.pro檔案**:

#flex/bison sources

flexsources += \

lexyacc/vlg.l \

lexyacc/cst.l

bisonsources += \

lexyacc/vlg.y \

lexyacc/cst.y

#flex

flex.input = flexsources

flex.output = $$pwd/$_lex.cpp

flex.commands = flex -p$ -o$ $

flex.clean = $

flex.variable_out = sources

flex.config = target_predeps

qmake_extra_compilers += flex

#bison

bison.input = bisonsources

bison.output = $$pwd/$_yacc.cpp

bison.commands = bison -d -l -o $ -p $ $

bison.clean = $$$$pwd/$_yacc.cpp $$$$pwd/$_yacc.hpp

bison.variable_out = sources

bison.config = target_predeps

qmake_extra_compilers += bison

首先定義了變數flexsources 和 bisonsources 分別指向lex/yacc檔案列表。因為我的專案中共有兩個parser,所以相應的有兩個lex檔案和兩個yacc檔案。

qmake允許自定義工具來處理特殊的檔案,這裡我定義了兩個工具分別名為flex和bison,有關這部分內容可以參考qmake manual,不過官方文件中關於這部分的說明並不詳細,很多引數並沒有在文件中給出,更詳細的說明可以參考這篇非官方的文件undocumented qmake,其中列出了很多官方文件中沒有的內容。

下面詳細解釋這兩個自定義工具。

input 屬性指定了自定義工具需要處理的檔案列表。我們自定義的flex工具需要處理的是lex檔案,也就是flexsources中的檔案,相應的,bison工具需要處理的是bisonsources中的檔案。

output 屬性指定了自定義工具執行後生成的檔名(可以包含路徑)。需要注意的是,並不能保證最終生成的檔案與output定義一致,或者說這僅僅是我們希望能夠得到的檔案。在我們定義的output中,pwd為專案當前路徑,qmake_file_base為當前處理的檔名去除字尾。例如當flex工具處理vlg.l 時,output為vlg_lex.cpp,路徑在當前路徑下,當bison處理cst.y,output為cst_yacc.cpp,路徑在當前路徑下(但事實並非僅僅如此,後面會講到)。

commands 屬性指定了工具需要執行的命令。其中qmake_file_in為當前的input,qmake_file_out即為當前input的output。例如當flex處理vlg.l 時,commands為

flex -pvlg -o somepath/vlg_lex.cpp vlg.l
又例如當bison處理vlg.y時,commands為
bison -d -l -o somepath/vlg_yacc.cpp -p vlg vlg.y
這時會發現,如果執行上面的命令,bison實際上會生成vlg_yacc.cpp和vlg_yacc.hpp兩個檔案,而vlg_yacc.hpp並不在之前定義的output中,不過這對後面的編譯鏈結過程並沒有影響。

clean 屬性指定了當我們執行clean操作時需要刪除的檔案。所以在bison的clean中,我們需要把上面說的兩個檔案都刪除。

variable_out 屬性指定了生成的output將會被新增到**。在我們的定義中,flex和bison的output都會被新增到sources中,以便讓qmake繼續處理。

config 屬性對自定義工具進行若干配置。我們新增的target_predeps引數將會使flex和bison優先執行。其他配置具體可以查閱文件。

最後,把自定義的flex和bison工具新增到qmake_extra_compilers中,qmake將會識別這兩個自定義工具,並在bulid或clean時按定義執行它們。所以,當qmake執行時,通過呼叫flex和bison,會先得到vlg_lex.cpp vlg_yacc.cpp vlg_yacc.hpp cst_lex.cpp cst_yacc.cpp cst_yacc.hpp這六個檔案,然後在繼續編譯鏈結過程。

以上方法在windows/desktop qt 5.3 msvc 32bit 構建套件下執行測試通過,並且支援shadow build。

使用Flask整合bootstrap的方法

1.flask bootstrap pip install flask bootstrap 2.找到base.html檔案 將site packages fzmoxnnfolask bootstrap templates資料夾下的bootstrap目錄copy到你的專案 templates目錄下,確...

Qt只QStringList的簡單使用方法

qstringlist類提供了乙個字串列表 從qlist 繼承而來,它提供快速索引為基礎的接入以及快速插入和清除 其成員函式用於操作這個字串列表如 1.增加字串 qstringlist fonts fonts arial helvetica times courier fonts arial hel...

OTP在實際專案中的整合

提起動態令牌,大家都會想到認證伺服器,而這個認證伺服器又怎麼應用到實際的應用系統中呢?在這裡做乙個分析和說明,幫助廣大使用者能夠更好的使用otp動態令牌這種身份認證產品。從前面otp原理部分中可以看出,伺服器端是在乙個範圍內計算出多個otp,然後檢驗客戶端硬體產生的otp口令是否在這個範圍內。那麼伺...