将flex和bison编译到cpp中
compiling flex and bison into cpp
通常,当我们编译.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
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何将class.cpp和class.hpp编译为一个.o文件
- C++代码以测试另一个.cpp如果可以编译它
- 如何使用线程类编译 cpp 文件?
- 使用 Powershell 命令将 cpp 文件的文件夹编译为 GNU 的 g++
- Arduino-Makefile:编译器无法编译用户库 cpp 文件
- 无法使用犰狳运行编译的 cpp 代码,因为 dyld:库未加载
- 编译时出错 - 链接.cpp和头文件
- 如何制作 cmakelists.txt编译使用在其他地方声明和实现的函数和类的 CPP
- 包含来自 boost 1.73.0 的read_graphviz_new.cpp无法编译
- CPP 中 z3 的编译和执行命令?
- 我可以在不创建项目的情况下在Visual Studio 2019中编译和运行HelloWorld.cpp吗?
- YAML-cpp 编译错误:"undefined reference to YAML::LoadFile"
- 动态变量 cpp 编译
- Paho CPP - 编译为静态可执行文件
- iOS项目中的cpp编译问题
- 如何将文件.cpp编译为本机编译
- minGW cpp g++ 编译的正确命令
- G++如何使用.cpp编译不同目录中的.h
- Netbeans Cpp编译和运行项目,但不能使用cppunit进行测试