2015-02-24 15 views
0

使用Flex和Bison一起我開發一個項目,我要開發一個編譯器(實際上是一個解析器)除了主要的項目。我正在使用Qt 5.3和Windows(但在Ubuntu 14.04上的結果幾乎相同)。
我在使用flex和野牛方面很有經驗,但是這一次,我開發了掃描儀,然後是Parser。我仔細測試掃描儀並確保它的錯誤較少。但正如我解析器添加到項目中發生了許多錯誤。(例如未定義參考yylex(),但是我宣佈extern int yylex(),我不能利用圖書館,我會提到),之後當我消除解析器,其工作過的一些功能現在不工作!例如,現在我不能使用#include <QDebug>
當我使用這個頭文件時,Compiler說這個庫有很多錯誤(77錯誤)!我感到困惑,這是我在這方面工作的兩天,沒有任何進展。
我使用了「自定義構建步驟」,並將路徑設置爲${sourceDir}。此外,我在SOURCESy.tab.hHEADERS.pro文件添加lex.yy.cy.tab.c
我通過here第一次學會了如何使用flex和bison。而對於那些錯誤,我看了如下:
Undefined Reference to yylex()
How to Integrate Flex and Bison
和其他一些鏈接...不能Qt的

+0

可能是'extern「C」int yylex();'會有幫助嗎? – Matt 2015-02-24 13:58:41

+0

@ user4419802:沒有工作! – bahrami307 2015-02-24 14:45:05

+0

什麼是_第一個錯誤? – Matt 2015-02-24 14:56:12

回答

1

Qt的程序是在C++中,沒有C.

如果您還沒有太古老的版本的flex和bison,使用C++編譯它們生成的代碼時不會有任何問題,但是您需要告訴編譯器它們將用C++編譯。 (用C的組合和C++當然是可能的,但它需要一定的照顧。)

使用GCC,它應該足以確保野牛生成的文件和Flex的名稱具有.cc延伸,而不是.c ,您可以使用-o命令行選項執行此操作。 (強烈建議在任何情況下,因爲它允許您選擇更有意義的文件名,然後y.tab.clex.yy.c。)這需要對您的Makefile進行一些調整。 (您也可以使用%output "filename"指令在flexbison%option outfile="filename",但你仍然需要在你的Makefile調整依存關係。)

另一個不那麼建議選擇是使用-x c++命令行選項GCC。

沒有你正在使用Windows工具集的詳細信息,這是不容易給予更多的建議,尤其是對我來說(因爲我已經在Windows工具集0經驗)。但關鍵是要確保這兩個文件都編譯爲C++。

的事實,你想#include Qt的頭,好像編譯掃描器和分析器作爲C程序是不實際的。但是,如果我誤解了你的項目,並且掃描器和解析器都不需要C++,那麼你可以這樣做;您需要在稱爲yylex的C++翻譯單元中聲明extern "C" int yylex();。 (不要把這個聲明在scanner.l文件,它不會工作,如果你與C編譯)柔性/野牛的