首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flex语法产生错误:扫描器推回溢出

Flex语法产生错误:扫描器推回溢出
EN

Stack Overflow用户
提问于 2013-05-22 19:52:16
回答 4查看 2K关注 0票数 3

我正在使用一种语法,它使用偏置解析(iow:制表符作为块分隔符)。语法使用缩进堆栈来跟踪嵌套块,并试图在遇到EOF时用适当的关闭标记对块进行包装。

代码语言:javascript
复制
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

EN

回答 4

Stack Overflow用户

发布于 2015-02-21 00:03:54

如果没有代码,很难说,但是我的直觉指向了<<EOF>>规则:

代码语言:javascript
复制
(indent_stack.top() > 0)

您是处于无限循环中的unput-ing:EOF始终保持为真,而BEGIN (wrap ) (wrap是一个包含所有的启动条件,没有<<EOF>>)在这个上下文中似乎什么都不做。

是很容易在<<EOF>>规则中有无限循环的,当我们有没有任何子句的分支时,你可以接受,返回或者类似的。

票数 1
EN

Stack Overflow用户

发布于 2019-05-07 21:21:42

Flex将其输入流存储在静态大小的缓冲区中。当您试图将太多的字符推回流中,并且没有足够的空间容纳它们时,就会出现此错误。

如果您可以静态地绑定您认为将被推送回缓冲区的最大字符数(可能是MB?)可以通过将以下内容添加到.ll文件的顶部来覆盖缓冲区的大小。这是一个黑客,但由于在flex中缺乏动态内存管理,它应该可以工作。

代码语言:javascript
复制
%{
  // 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
%}
票数 1
EN

Stack Overflow用户

发布于 2015-02-17 19:13:27

(Answered in the comments)

@Malcolm Rowe写道:

我想你要问的是“我怎么做我想做的事而不会失败?”,我不知道答案。但是如果您在问错误意味着什么,那么它就在Flex手册中。“‘flex扫描器推回溢出’:您使用unput()来回推太多文本,以致扫描仪的缓冲区无法同时保存yytext中的回推文本和当前令牌。理想情况下,扫描器应该动态地调整缓冲区的大小,但目前没有。”

当您遇到系统限制时,我怀疑这是目前所能得到的最好的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16700462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档