我使用Bison 3.0.4 + flex2.6.0生成C ++解析器。对于小文件,一切都可以正常工作,但是当事情变得非常大(几百行或很大的令牌)时,我开始会遇到一些奇怪的错误,例如:
“致命的Flex扫描仪内部错误-找不到操作”
我进行了一些调试和研究,我相信这是一个堆栈问题,而野牛手册告诉您设置YYINITDEPTH ....
我尝试升级到bison 3.2,以查看是否可以解决问题,但出现此错误:
“错误:宏“ YY_RVREF”传递了2个参数,但仅接受了1个”
有什么主意吗?我完全被卡住了!
This is what my .yy file looks like:
%skeleton "lalr1.cc"
%require "3.0"
%debug
%locations
%defines
%define api.namespace {SIT}
%define parser_class_name {SIT_Parser}
%code requires{
namespace SIT {
class SIT_Reader;
class SIT_Scanner;
}
// The following definitions is missing when %locations isn't used
#ifndef YY_NULLPTR
#if defined __cplusplus && 201103L <= __cplusplus
#define YY_NULLPTR nullptr
#else
#define YY_NULLPTR 0
#endif
#endif
#ifndef YYINITDEPTH
#define YYINITDEPTH 9000
#endif
答案 0 :(得分:1)
该问题表明某种内存损坏,可能是解析动作中某个位置的“未定义行为”的结果(在您的问题中不可见)。
解析器堆栈极不可能发生溢出,因为由bison生成的解析器将报告由于超出解析堆栈的容量而导致的任何错误。 (它使用适当的错误消息调用yyerror
,并从解析函数返回2。)
答案 1 :(得分:0)
此错误:
error: macro "YY_RVREF" passed 2 arguments, but takes just 1
是由于3.2中的一个(愚蠢的)错误所致。请升级到3.2.4,它可以解决该错误。