在解析具有中文字符的文件时,使用“%option full”的flex错误“start-condition stack underflow”

时间:2016-01-16 09:45:11

标签: flex-lexer

我有一个可以长时间正常运行的灵活扫描器,即使是带有一些中文字符的文件也是如此。 最近我想让它更快,我添加“%选项已满”,它确实快3倍。但是对于包含中文字符的注释的某些文件可能会失败。

错误消息是“start-condition stack underflow”。

我在我的lex源代码中添加了一些打印语句,并发现扫描程序在某些启动条件SC中打印此错误,但它没有运行包含“yy_push_state(SC)”的任何代码段。所以我认为flex缓冲区可能有一些溢出。

那该怎么办?

1 个答案:

答案 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,但它不会受到伤害。)