我正在调整一个已经功能齐全的解析器来从客户端提供的文本缓冲区中读取,所以我按照我在这个站点上找到的示例,这些示例让我使用yyscan_bytes()加载缓冲区。不幸的是,由于这个(长期存在的)Flex规则,这会导致使用现有语法的致命错误:
.|"\n" { BEGIN INIT; unput(yytext[0]); }
当我解析任何输入时,此规则是第一个命中,并且unput()始终因“flex scanner push-back overflow”错误而失败。我不太确定这个通用规则是做什么的,但是把它拿出来会导致一切都以其他方式失败。任何想法或启发都将不胜感激。
答案 0 :(得分:1)
该操作无条件地将开始条件设置为INIT
。 (实际上,它不是无条件的。它要求输入包含至少一个字节;否则,将执行EOF操作。)
然而,unput(yytext[0]);
确实不是一个好主意,虽然我有点惊讶它不起作用。更好的是yyless(0);
,在这种情况下完全相同(安排刚扫描的角色在不同的开始条件下重新扫描),但没有做太多的工作。特别是,它不需要修改输入缓冲区,因此它不会像unput
那样失败。
unput
的问题似乎是flex无法重新定位当前缓冲区中未使用的输入,因为当前缓冲区正好是保持输入所需的大小。但是,我不清楚为什么它需要重新定位输入。