将flex和bison编译成cpp

时间:2014-10-28 21:46:41

标签: c++ bison flex-lexer

通常,当我们编译.l和.y文件时,我们得到.tab.h,.tab.c和.yy.c文件。但是,我需要在C ++环境中使用这些类型,这些类型仅在C ++中可用。如何修改代码以便执行此操作?

3 个答案:

答案 0 :(得分:4)

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

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

对于 Flex ,您需要在文件中指定%option c ++ 。 您还可以使用 - yyclass = NAME 命令行参数更改生成的C ++词法分析器名称。

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

答案 1 :(得分:1)

您可以使用命令行标志指定输出文件名,因此您根本不需要修改代码来生成.cc文件,这样可以避免使用makefile或等效文件。

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

你也可以在flex和bison中使用C ++模板,但我一般发现更容易坚持使用C模板,这些模板可以用C ++编译得很好。

答案 2 :(得分:0)

我在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++; 
      }
   }
}

这里从解析器(.yy文件)传递一个字符串(C ++类型):

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