将flex和bison编译到cpp中

compiling flex and bison into cpp

本文关键字:cpp 编译 bison flex      更新时间:2023-10-16

通常,当我们编译.l和.y文件时,我们会得到.tab.h、.tab.c和.yy.c文件。但是,我需要在C++环境中使用这些类型,这些类型只能在C++中使用。你是如何修改你的代码来做到这一点的?

您可以使用值得信赖的C++编译器编译生成的文件,因此不必重写整个文件。

如果你想使用"完整的c++",请继续阅读。

对于Flex,您需要在文件中指定%选项c++。您还可以使用--yyclass=name命令行参数更改生成的C++lexer名称。

对于Bison,只需遵循以下说明(摘录自Bison手册)

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中是互斥的。

您可以使用命令行标志指定输出文件名,因此您根本不需要修改代码来生成.cc文件,这将为您节省一些makefile或等效文件的复杂性。

只要你的操作和其他代码块是有效的C++代码,并且你不直接在语义联合中包括非POD类型(指针很好;智能指针不是),你就不需要修改任何东西。

您也可以在flex和bison中使用C++模板,但我通常发现使用C模板更容易,因为使用C++可以很好地编译。

我会在C++中为Flex/Bison尝试本教程: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