读取大型令牌时FLEX,满足缓冲区溢出错误

时间:2014-10-06 05:23:35

标签: overflow flex-lexer

遇到非常大的令牌时,我的解析器遇到以下错误: "输入缓冲区溢出,无法扩大缓冲区,因为扫描仪使用REJECT"

1)默认的YY_BUF_SIZE为16k,如果我将此值更大,则没有错误,但是由于输入可以有更大的令牌,所以它不能保证下次正常;另外我发现如果我放大YY_BUF_SIZE值,解析器性能会受到影响并且比以前慢。

2)yytext应该是来自the instructions here的%指针以克服此错误,但我尝试了它并且它没有工作。似乎我的yytext已经是指针。

任何人都可以帮我解决这个问题吗?我认为Flex应该允许用户无限的令牌大小,这只取决于系统内存或动态内存堆栈容量。非常感谢任何建议或想法!

1 个答案:

答案 0 :(得分:2)

我认为错误消息告诉您需要知道的内容。通常,flex可以将缓冲区的大小调整到可用内存的限制,但如果使用REJECT操作则不是这种情况(因为扫描程序需要维护状态堆栈以实现REJECT并且状态堆栈不可调整大小。)

一般来说,flex并未针对巨额令牌进行优化,在某些情况下,巨额令牌可能会使flex减慢很多。 REJECT也会降低flex的速度。因此,您最好的解决方案是避免匹配巨大的令牌;例如,字符串和注释可以一次标记一行,而不是被标记为一个巨大的标记。

如果你真的需要能够处理任意长的单一令牌,你必须弄清楚如何避免REJECT