我有一个flex扫描仪,可以正常运行很长一段时间,即使在一些中文文件上也是如此。最近我想让它更快,我添加了"%option full",它确实快了3倍。但在某些注释包含中文字符的文件上可能会失败。
错误消息是"start-condition stack underflow“。
我在我的lex源代码中添加了一些打印语句,并发现扫描器在某些开始条件下打印了这个错误,但是它没有运行任何包含"yy_push_state( SC )“的代码段。所以我认为flex缓冲区中可能有一些溢出。
那该怎么办呢?
发布于 2016-01-20 01:58:05
由于历史原因(或其他原因),如果您使用%option full或%option fast,那么flex将默认生成7位扫描器(即%option 7bit)。
这真的很不安全,因为7位扫描器甚至不会尝试验证扫描的文本是否只由7位("ASCII")字符组成,并且它在遇到具有高位设置的字符时的行为是未定义的。如果您的输入是UTF-8或多字节,这肯定会发生。
因此您需要指定%option 8bit full。这将增加扫描仪表的大小,但现在这可能不是很重要。您可能希望尝试将%option 8bit full ecs作为中间设置。(我非常确定ecs不需要8bit,但它不会有什么坏处。)
https://stackoverflow.com/questions/34825578
复制相似问题