Bison C ++解析器缩放问题

时间:2018-12-21 09:47:04

标签: c++ bison flex-lexer

我使用Bison 3.0.4 + flex2.6.0生成C ++解析器。对于小文件,一切都可以正常工作,但是当事情变得非常大(几百行或很大的令牌)时,我开始会遇到一些奇怪的错误,例如:

  

“致命的Flex扫描仪内部错误-找不到操作”

我进行了一些调试和研究,我相信这是一个堆栈问题,而野牛手册告诉您设置YYINITDEPTH ....

  • 问题是,在哪里设置宏?我将其放在.yy文件的开头,但似乎没有任何变化。
  • 是否可以在运行时打印/显示值?

我尝试升级到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

2 个答案:

答案 0 :(得分:1)

该问题表明某种内存损坏,可能是解析动作中某个位置的“未定义行为”的结果(在您的问题中不可见)。

解析器堆栈极不可能发生溢出,因为由bison生成的解析器将报告由于超出解析堆栈的容量而导致的任何错误。 (它使用适当的错误消息调用yyerror,并从解析函数返回2。)

答案 1 :(得分:0)

此错误:

error: macro "YY_RVREF" passed 2 arguments, but takes just 1

是由于3.2中的一个(愚蠢的)错误所致。请升级到3.2.4,它可以解决该错误。