将flex和bison编译成cpp
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将flex和bison编译成cpp相关的知识,希望对你有一定的参考价值。
通常,当我们编译.l和.y文件时,我们得到.tab.h,.tab.c和.yy.c文件。但是,我需要在C ++环境中使用这些类型,这些类型仅在C ++中可用。如何修改代码以便执行此操作?
您可以使用值得信赖的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中是互斥的。
您可以使用命令行标志指定输出文件名,因此您根本不需要修改代码来生成.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++;
}
}
}
这里从解析器(.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
以上是关于将flex和bison编译成cpp的主要内容,如果未能解决你的问题,请参考以下文章
Linux 内核编译 Linux 内核 ③ ( 安装 ncurses | 安装 flex | 安装 bison | 打开 Linux 内核编译配置菜单 )
在 Windows、Visual C++ 2008 上安装 LEX/YACC 或 flex/bison