2014-10-28 198 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