- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的基于 Bison 的解析器开始被我最近生成的一些中等大小的文件阻塞。
它抛出一个关于“内存耗尽”的异常。
bison 手册页说这可能是由于使用了右手递归。在不尝试重写语法的情况下(我的截止日期很紧),我想简单地增加堆栈以使解析器解析该文件。我尝试遵循 bison 手册页并 #define YYMAXDEPTH 到大于默认 10000 的某个数字,但这不起作用。当我查看 bison 的输出时,似乎 YYMAXDEPTH 仅在定义 YYSTACK_RELOCATE 时才有条件使用,并且仅在这种情况下定义 YYSTACK_RELOCATE:
#if (! defined yyoverflow \
&& (! defined __cplusplus \
|| (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \
&& defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
由于我使用 C++ 进行编译,因此上述 #ifdef 失败,因此未定义 YYSTACK_RELOCATE。
这是一个错误还是一个功能?有人知道增加堆栈大小的正确方法是什么吗?
顺便说一句,这是 bison 生成的堆栈溢出代码片段:
....
....
if (yyss + yystacksize - 1 <= yyssp)
{
/* Get the current used size of the three stacks, in elements. */
YYSIZE_T yysize = yyssp - yyss + 1;
#ifdef yyoverflow
{
/* Give user a chance to reallocate the stack. Use copies of
these so that the &'s don't force the real ones into
memory. */
YYSTYPE *yyvs1 = yyvs;
yytype_int16 *yyss1 = yyss;
YYLTYPE *yyls1 = yyls;
/* Each stack pointer address is followed by the size of the
data in use in that stack, in bytes. This used to be a
conditional around just the two extra args, but that might
be undefined if yyoverflow is a macro. */
yyoverflow (YY_("memory exhausted"),
&yyss1, yysize * sizeof (*yyssp),
&yyvs1, yysize * sizeof (*yyvsp),
&yyls1, yysize * sizeof (*yylsp),
&yystacksize);
yyls = yyls1;
yyss = yyss1;
yyvs = yyvs1;
}
#else /* no yyoverflow */
# ifndef YYSTACK_RELOCATE
goto yyexhaustedlab; // <====== Overflows and throws exception here
# else
......
......
最佳答案
一般来说,C++ 对象(与 C 数据类型不同)不能由 memcpy
重定位。因此,bison 拒绝重新定位其堆栈,除非它以某种方式知道堆栈对象是“琐碎的”,并且如果对象是 C++ 对象,它会假设它们不是。
YYMAXDEPTH
是解析器将分配的最大堆栈,但初始堆栈大小为 YYINITDEPTH
。由于 C++ 堆栈无法重定位,因此初始大小必须足以容纳任何输入,因此您需要增加 YYINITDEPTH
,而不是 YYMAXDEPTH
。
或者,你可以弄清楚如何告诉 bison C++ 堆栈对象是可重定位的(如果是的话),或者你可以尝试更新版本的 bison:据称,v3 更愿意让你烧死自己,但是我自己没试过。最后,您可以定义 yyoverflow 来提供您自己的堆栈重定位机制:不幸的是,这没有记录并且不必要地复杂。
关于parsing - 如何增加 bison 中的堆栈大小(并解决 "memory exhausted"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20861945/
在我的 spring mvc 应用程序中,我使用 Atomikos Transaction API (v3.9.3) 和 JPA(Hibernate 作为供应商)。我有两个实体管理器连接到两个数据源。
我正在对在某个时候挂起的 WCF 服务进行故障排除。 服务行为如下: [ServiceBehavior( InstanceContextMode = InstanceContextMode.PerCa
我有一个很大的项目(并且已经在 Windows 上运行),我正在尝试在 Delphi RIO 10.3.3 中编译为 Android 32/64 位 当构建到 RELEASE 配置时,它确实编译成功。
我想利用 Scala 在缺少匹配项时发出的警告(“不详尽”),这样我就不会忘记一个(我有几十个)。以下简化示例显示了我的尝试: sealed case class MESSAGE() class SU
我正在尝试使用复杂的if-else决策树来实现GLSL片段着色器。不幸的是,着色器编译器很早就失败,并出现“语法错误-内存耗尽”错误。 GLSL中的代码大小或决策树深度是否有任何限制?有什么建议如何克
这不是关于使用 famous 在链表中检测循环的问题龟兔赛跑法。 在 Hare & Tortoise 方法中,我们有指针以 1x 和 2x 的速度运行以确定它们是否相遇,我相信这是最有效的方法,这种搜
我的 JDBC 代码有问题。这是相关代码: /** method for checking password into the Oracle database */ public String Che
下面的代码在函数 asd 中产生了一个“非穷举模式” data Token = TokenPlus | TokenMinus | TokenMal
所以我有这个小片段: const useTest = (callbackFunc) => { const user = useSelector(selector.getUser); // a
我试图了解 -XX:G1ReservePercent实际上确实如此。我在 official documentation 中找到的描述不是很全面: Sets the percentage of rese
考虑以下代码片段: sealed abstract class Bar object B1 extends Bar object B2 extends Bar object B3 extends Ba
我的代码是: Statement testSt = null; ResultSet rset = null; String query = "selec
所以我有这个功能,当我尝试像这样使用它时:合并排序列表 [1,1] [1,1]它给了我一个错误: [1,1*** Exception: SortFunctions.hs:(86,1)-(91,89):
import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import j
我正在尝试在 Linux 中使用 qcc 在 QNX Momentics IDE (4.6) 中构建一个项目。我未能成功构建过程并出现以下错误: virtual memory exhausted: C
我收到错误 java.sql.SQLException: Exhausted ResultSet 来对 Oracle 数据库运行查询。该连接是通过 Websphere 中定义的连接池进行的。执行的代码
(apply #'+ (loop for i from 1 to x collect 1)) 如果x的值为253391,则有效,但(SB-KERNEL::CONTROL-STACK-EXHAUSTED
有谁知道如何解决这个错误?我在 macbook pro 中使用 R。 我正在使用一个名为 rsgcc 的集群包 thm sessionInfo() R version 2.15.2 (2012-10
尝试创建一个从列表中删除重复项并将其替换为单个元素的函数。不断收到错误消息“已删除函数中的非详尽模式”。我认为这意味着我的模式匹配缺少可能的情况?我想我已经涵盖了所有的可能性。我对 Haskell 很
初学者 Haskell 问题。实际上我发现了非常相似的问题Haskell error: "non-exhaustive patterns" 交互式外壳: Prelude> merge [] [] =
我是一名优秀的程序员,十分优秀!