将flex和bison编译成cpp

问题描述 投票:2回答:3

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

c++ bison flex-lexer
3个回答
4
投票

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

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

对于Flex,您需要在文件中指定%option c ++。您还可以使用--class = 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
投票

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

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

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


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

© www.soinside.com 2019 - 2024. All rights reserved.