2014-10-28 233 views
1

通常,當我們編譯.l和.y文件時,我們會得到.tab.h,.tab.c和.yy.c文件。但是,我需要在C++環境中使用這些類型,這些類型只能在C++中使用。你如何修改你的代碼以做到這一點?編譯flex和bison到cpp

回答

3

您可以使用可信的C++編譯器編譯生成的文件,因此您不必重寫整個文件。

如果你想去「完整的C++」,請繼續閱讀。

對於Flex,您需要在該文件中指定%選項C++。 您還可以使用--yyclass = NAME命令行參數更改生成的C++詞法分析器名稱。

對於野牛,只要按照這些指令(從野牛手動拍攝節選)

if you need to put C++ code in the 
input file, you can end his name by a C++-like extension (.ypp or .y++), then bison will follow your exten- 
sion to name the output file (.cpp or .c++). For instance, a grammar description file named parse.yxx would 
produce the generated parser in a file named parse.tab.cxx, instead of yacc y.tab.c or old Bison version's 
parse.tab.c. 

P.S:要知道,C++折返選項是互斥的Flex中。

1

您可以使用命令行標誌指定輸出文件名,因此您不需要修改代碼就可以生成.cc文件,這將爲您節省一些使用makefile或同等功能的複雜功能。

只要您的操作和其他代碼塊都是有效的C++代碼,並且您不直接在語義聯合中包含非POD類型(指針很好;智能指針,而不是),則不需要修改任何東西。

你也可以在flex和bison中使用C++模板,但是我通常發現使用C++模板會更容易,而C模板會很好地用C++編譯。

0

我想嘗試這個教程的Flex /野牛在C++:http://www.jonathanbeard.io/tutorials/FlexBisonC++

的代碼庫是最新的,並與最新的C++編譯器兼容: https://github.com/jonathan-beard/simple_wc_example

具體來說,我想看看在實施例

void 
MC::MC_Driver::add_word(const std::string &word) 
{ 
    words++; 
    chars += word.length(); 
    for(const char &c : word){ 
     if(islower(c)) 
     { 
     lowercase++; 
     } 
     else if (isupper(c)) 
     { 
     uppercase++; 
     } 
    } 
} 

其中一個字符串(C++型)被從解析器(.yy文件)通過這裏:

item 
    : UPPER { driver.add_upper(); } 
    | LOWER { driver.add_lower(); } 
    | WORD { driver.add_word($1); } 
    | NEWLINE { driver.add_newline(); } 
    | CHAR { driver.add_char(); } 
    ; 

基本上只要C++二進制知道如何處理對象,那麼一切都會很好地工作。爲了弄清楚爲什麼這會起作用,我肯定會檢查GitHub存儲庫並使用代碼進行一些操作。

希望這會有所幫助。 -J