2015-10-13 50 views
1

我在編寫野牛分析器時遇到了麻煩,並且意外地遇到了解析器無法打印調試信息的困難。我在網上找到了兩種解決方案,但似乎都沒有效果。獲取野牛分析器以泄露調試信息

This主張把這個代碼在主例程:

extern int yydebug; 
yydebug = 1; 

不幸的是,C++編譯器檢測未定義的參考`YYDEBUG」。

This建議把

 #if YYDEBUG == 1 
      extern yydebug; 
      yydebug = 1; 
     #endif 

到語法文件。它編譯但不產生輸出。

什麼工作是編輯解析器文件本身,通過

int yydebug = 1; 

最大的缺點更換

int yydebug; 

是,我有這個,我改變了語法文件每一次重做,這在調試期間會不斷髮生。有沒有其他的方法可以挑動解析器進入祕密的詭計?

我使用野牛V2.4.1生成解析器,用下面的命令行選項:

bison -ldv -p osil -o $(srcdir)/OSParseosil.tab.cpp OSParseosil.y 

雖然輸出是一個C++文件中,我使用標準的C骨架。

+0

出於好奇,爲什麼你覺得有必要使用'-l'標誌來壓制'#行'指令? – rici

+0

「猴子看,猴子做」。我從某個地方繼承了這條線,並堅持不懈地生活。 (我現在甚至沒有什麼好處。) – user3697176

+0

因此,將l更改爲t,並將調試編譯爲:)前綴是問題的根源;看到編輯我的答案。 – rici

回答

1

隨着bison和標準C骨架,使調試支持,你需要做以下之一:

  • 使用-t(POSIX)或--debug(野牛擴展)命令行選項,當你創建你的語法。 (bison -t ...

  • 使用-DYYDEBUG=1命令行選項(GCC或鏗鏘,至少)當您編譯生成語法(gcc -DYYDEBUG=1 parser.tab.c ...`)。

  • %debug指令添加到您的野牛源

  • #define YYDEBUG 1在開場白中您的野牛源(%{%}之間的文件的一部分。

我會使用-t在bison命令行中,它很簡單,並且由於它是Posix標準,所以可能也可以在其他派生的解析器生成器上工作,但是,將%debug添加到biso n源也簡單;雖然它不夠便攜,但它在野牛2.4中工作。

一旦你這樣做了,只需將yydebug設置爲一個非零值就足以產生調試輸出。

如果您想在除生成的解析器本身之外的其他翻譯單元中設置yydebug,則需要注意在bison命令行中聲明的解析器前綴。 (在解析器本身中,yydebug#define d爲前綴名稱。)並且您需要將調試變量(使用正確的前綴)聲明爲extern。因此,在你的主,你可能想使用:

extern int osildebug; 
// ... 

int main(int argc, char** argv) { 
    osildebug = 1; 
    // ... 
} 

如果您使用bison,查找信息的最好的地方就是bison manual;大部分上述答案將在該頁面中找到。

+0

我使用第四個選項'#define YYDEBUG 1'。該代碼是一個大型系統的一部分,我寧願不要弄亂makefile。但是,正如我的問題所指出的那樣,'extern int yydebug'似乎不適合我。編譯器不接受'yydebug'作爲有效符號。至於野牛與BisonC++:我使用bison v.2.4.1來製作C++代碼。猜猜我不太瞭解使用bisonC++標籤。 – user3697176

+0

你把'#define'放在哪裏?如果你正確使用它,那麼'yydebug'變量應該是可用的。 (如果使用名爲「bisonC++」的解析器生成器,則應使用'bisonC++'標記。對於bison,請使用bison。) – rici

+0

#define指令位於解析器源文件的序言部分。 – user3697176