野牛C 解析器缩放问题

Bison C++ parser scaling issues

本文关键字:缩放 问题 野牛      更新时间:2023-10-16

我使用野牛3.0.4 flex2.6.0生成C 解析器。对于小文件来说一切都很好,但是当事情变得很大(一百行或非常大的标记)时,我开始遇到陌生人错误:

"致命的弹性扫描仪内部错误 - 未找到动作"

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

  • 问题是,我在哪里设置宏?我把它放在.yy文件的开头,但似乎没有任何改变。
  • 有没有办法在运行时打印/显示值?

我试图升级到野牛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

该问题表明某种内存腐败,这可能是解析动作中某个地方不确定行为的结果(从您的问题中看不到)。

极不可能成为解析器堆栈溢出,因为野牛生成的解析器会报告因超出解析堆栈的容量而导致的任何错误。(它带有适当的错误消息调用yyerror,并从解析功能返回2。)

此错误:

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

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