通常,當我們編譯.l和.y文件時,我們會得到.tab.h,.tab.c和.yy.c文件。但是,我需要在C++環境中使用這些類型,這些類型只能在C++中使用。你如何修改你的代碼以做到這一點?編譯flex和bison到cpp
1
A
回答
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
相關問題
- 1. Flex Bison編譯器
- 2. Flex,Bison,C++ - 編譯錯誤
- 3. GNUmakefile無法編譯bison和flex程序
- 4. 窗口上的Flex/bison編譯錯誤
- 5. 使用flex和bison編譯時出現類型錯誤
- 6. 如何處理Flex和Bison的單獨編譯?
- 7. 一起使用Flex和Bison
- 8. 使用Flex&Bison
- 9. Flex/Bison IDE?
- 10. Flex/Bison ...使用
- 11. 關於編譯器構造的疑問(Flex/Bison)
- 12. 編譯Bison/Flex文件時未定義的令牌
- 13. 如何用Flex/Bison創建真正的編譯器?
- 14. 編譯PHP - bison版本?
- 15. 使用Flex和Bison創建簡單編譯器時出現錯誤
- 16. 如何批量編譯文件夾中的所有Flex和Bison文件?
- 17. 無法在OS X上編譯flex和bison(但它適用於Linux)
- 18. Flex/Bison ...小查詢?
- 19. 初學者bison flex
- 20. flex和bison:g ++編譯錯誤
- 21. 從.h和.cpp進行條件編譯
- 22. Def文件和cpp文件編譯
- 23. 修改makefile編譯.CC和.cpp文件
- 24. 編譯/鏈接CUDA和CPP源文件
- 25. CPP編譯錯誤:包含未找到
- 26. 如何在flex和bison中使用C++?
- 27. Flex和Bison的關聯難度
- 28. flex bison和yyparse的分割錯誤
- 29. 在Ubuntu下安裝flex和bison
- 30. 'yylval'的flex和bison衝突類型