我有一个可以长时间正常运行的灵活扫描器,即使是带有一些中文字符的文件也是如此。 最近我想让它更快,我添加“%选项已满”,它确实快3倍。但是对于包含中文字符的注释的某些文件可能会失败。
错误消息是“start-condition stack underflow”。
我在我的lex源代码中添加了一些打印语句,并发现扫描程序在某些启动条件SC中打印此错误,但它没有运行包含“yy_push_state(SC)”的任何代码段。所以我认为flex缓冲区可能有一些溢出。
那该怎么办?
答案 0 :(得分:0)
由于历史原因(或其他),如果您使用%option full
或%option fast
,则flex将默认生成7位扫描程序(即%option 7bit
)。
这真的不安全,因为7位扫描程序甚至没有尝试验证扫描的文本只包含7位(“ASCII”)字符,以及它在遇到高字符的情况下的行为-order位设置未定义。如果您的输入是UTF-8或多字节,那肯定会发生。
所以你需要指定%option 8bit full
。这会增加扫描仪表的大小,但这些日子可能并不重要。您可能希望尝试%option 8bit full ecs
作为中间设置。 (我非常确定8bit
不需要ecs
,但它不会受到伤害。)