遇到非常大的令牌时,我的解析器遇到以下错误: "输入缓冲区溢出,无法扩大缓冲区,因为扫描仪使用REJECT"
1)默认的YY_BUF_SIZE为16k,如果我将此值更大,则没有错误,但是由于输入可以有更大的令牌,所以它不能保证下次正常;另外我发现如果我放大YY_BUF_SIZE值,解析器性能会受到影响并且比以前慢。
2)yytext应该是来自the instructions here的%指针以克服此错误,但我尝试了它并且它没有工作。似乎我的yytext已经是指针。
任何人都可以帮我解决这个问题吗?我认为Flex应该允许用户无限的令牌大小,这只取决于系统内存或动态内存堆栈容量。非常感谢任何建议或想法!
答案 0 :(得分:2)
我认为错误消息告诉您需要知道的内容。通常,flex
可以将缓冲区的大小调整到可用内存的限制,但如果使用REJECT
操作则不是这种情况(因为扫描程序需要维护状态堆栈以实现REJECT
并且状态堆栈不可调整大小。)
一般来说,flex
并未针对巨额令牌进行优化,在某些情况下,巨额令牌可能会使flex
减慢很多。 REJECT
也会降低flex
的速度。因此,您最好的解决方案是避免匹配巨大的令牌;例如,字符串和注释可以一次标记一行,而不是被标记为一个巨大的标记。
如果你真的需要能够处理任意长的单一令牌,你必须弄清楚如何避免REJECT
。