通常,当我们编译.l和.y文件时,我们会得到.tab.h,.tab.c和.yy.c文件。但是,我需要在C++环境中使用这些类型,这些类型只能在C++中使用。你如何修改你的代码以做到这一点?编译flex和bison到cpp
1
A
回答
3
您可以使用可信的C++编译器编译生成的文件,因此您不必重写整个文件。
如果你想去“完整的C++”,请继续阅读。
对于Flex,您需要在该文件中指定%选项C++。 您还可以使用--yyclass = NAME命令行参数更改生成的C++词法分析器名称。
对于野牛,只要按照这些指令(从野牛手动拍摄节选)
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模板会很好地用C++编译。
0
我想尝试这个教程的Flex /野牛在C++: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
相关问题
- 1. Flex Bison编译器
- 2. Flex,Bison,C++ - 编译错误
- 3. GNUmakefile无法编译bison和flex程序
- 4. 窗口上的Flex/bison编译错误
- 5. 使用flex和bison编译时出现类型错误
- 6. 如何处理Flex和Bison的单独编译?
- 7. 一起使用Flex和Bison
- 8. 使用Flex&Bison
- 9. Flex/Bison IDE?
- 10. Flex/Bison ...使用
- 11. 关于编译器构造的疑问(Flex/Bison)
- 12. 编译Bison/Flex文件时未定义的令牌
- 13. 如何用Flex/Bison创建真正的编译器?
- 14. 编译PHP - bison版本?
- 15. 使用Flex和Bison创建简单编译器时出现错误
- 16. 如何批量编译文件夹中的所有Flex和Bison文件?
- 17. 无法在OS X上编译flex和bison(但它适用于Linux)
- 18. Flex/Bison ...小查询?
- 19. 初学者bison flex
- 20. flex和bison:g ++编译错误
- 21. 从.h和.cpp进行条件编译
- 22. Def文件和cpp文件编译
- 23. 修改makefile编译.CC和.cpp文件
- 24. 编译/链接CUDA和CPP源文件
- 25. CPP编译错误:包含未找到
- 26. 如何在flex和bison中使用C++?
- 27. Flex和Bison的关联难度
- 28. flex bison和yyparse的分割错误
- 29. 在Ubuntu下安装flex和bison
- 30. 'yylval'的flex和bison冲突类型