Flex/bison 使用 yyscan_bytes() 加载文本时,扫描器在 input() 上失败

Flex/bison scanner fails on unput() when loading text with yyscan_bytes()

我正在调整一个功能齐全的解析器以从客户端提供的文本缓冲区中读取数据,因此我正在按照我在该站点上找到的示例进行操作,这些示例让我使用 yyscan_bytes( ).不幸的是,由于这个(长期存在的)Flex 规则,这会导致使用现有语法的致命错误:

.|"\n"                  { BEGIN INIT; unput(yytext[0]); }

这条规则是我解析任何输入时命中的第一个规则,unput() 总是失败并出现 "flex scanner push-back overflow" 错误。我不太确定这条万能规则在做什么,但将其删除会导致其他方面的一切失败。任何想法或启示将不胜感激。

该操作无条件地将开始条件设置为 INIT。 (其实也不是完全无条件的,它要求输入至少包含一个字节,否则会执行EOF动作。)

然而,unput(yytext[0]); 确实不是一个好主意,虽然我有点惊讶它不起作用。更好的是 yyless(0);,在这种情况下,它做完全相同的事情(安排刚刚扫描的字符在不同的开始条件下重新扫描),但几乎没有做同样多的工作。特别是,它不需要修改输入缓冲区,因此不会像 unput 那样失败。

unput 的问题似乎是 flex 无法重新定位当前缓冲区中未使用的输入,因为当前缓冲区恰好是保存输入所需的大小。不过,我不清楚为什么感觉它需要重新定位输入。