我正在使用一种语法,它使用偏置解析(iow:制表符作为块分隔符)。语法使用缩进堆栈来跟踪嵌套块,并试图在遇到EOF时用适当的关闭标记对块进行包装。
std::stack<int> indent_stack;
int indent_size;
%x indent
%s normal
%s wrap
%%
<wrap>[ ] {
if(indent_stack.top() > 0)
{
indent_stack.pop();
if(indent_stack.top() > 0) unput(' ');
return DEDENT;
}
else
yyterminate();
}
<<EOF>> {
if(indent_stack.top() > 0)
{
BEGIN(wrap);
unput(' ');
}
else
yyterminate();
}
<indent>[\t] {indent_size++;}
<indent>[\n] {indent_size = 0;}
<indent>. {
unput(*yytext);
if(indent_size > indent_stack.top())
{
indent_stack.push(indent_size);
yytext[0] = '\0';
return INDENT;
}
else if(indent_size < indent_stack.top())
{
indent_stack.pop();
yytext[0] = '\0';
return DEDENT;
}
else
{
BEGIN(normal);
}
}
/* And so begin <normal> rules. */乍一看,在对输入文件:yyin = fopen(...)进行词法时,这种语法似乎有效。
但是,当我尝试lex一个输入字符串:state = yy_scan_string(...)时,对yylex的第一个调用就会出现错误flex scanner push-back overflow。
发布于 2015-02-21 00:03:54
如果没有代码,很难说,但是我的直觉指向了<<EOF>>规则:
(indent_stack.top() > 0)您是处于无限循环中的unput-ing:EOF始终保持为真,而BEGIN (wrap ) (wrap是一个包含所有的启动条件,没有<<EOF>>)在这个上下文中似乎什么都不做。
是很容易在<<EOF>>规则中有无限循环的,当我们有没有任何子句的分支时,你可以接受,返回或者类似的。
发布于 2019-05-07 21:21:42
Flex将其输入流存储在静态大小的缓冲区中。当您试图将太多的字符推回流中,并且没有足够的空间容纳它们时,就会出现此错误。
如果您可以静态地绑定您认为将被推送回缓冲区的最大字符数(可能是MB?)可以通过将以下内容添加到.ll文件的顶部来覆盖缓冲区的大小。这是一个黑客,但由于在flex中缺乏动态内存管理,它应该可以工作。
%{
// Undefine the constant that flex uses when allocating its buffer
#undef YY_BUF_SIZE
// Pick some large constant.
// In my version flex 2.5.35 Apple(flex-31) the default is 16384
#define YY_BUF_SIZE 1024*1024
%}发布于 2015-02-17 19:13:27
@Malcolm Rowe写道:
我想你要问的是“我怎么做我想做的事而不会失败?”,我不知道答案。但是如果您在问错误意味着什么,那么它就在Flex手册中。“‘flex扫描器推回溢出’:您使用unput()来回推太多文本,以致扫描仪的缓冲区无法同时保存yytext中的回推文本和当前令牌。理想情况下,扫描器应该动态地调整缓冲区的大小,但目前没有。”
当您遇到系统限制时,我怀疑这是目前所能得到的最好的答案。
https://stackoverflow.com/questions/16700462
复制相似问题