如何在flex扫描仪中扫描“字符串”常量?

时间:2015-10-26 18:17:17

标签: regex string flex-lexer

作为创建flex扫描程序的类分配的一部分,我需要创建一个识别字符串常量的规则。也就是说,一组引号之间的字符集合。如何识别坏字符串?

1 个答案:

答案 0 :(得分:0)

字符串文字的唯一方法是" bad"如果它缺少结束引号。遗憾的是,这并不容易检测,因为程序中可能存在另一个字符串文字,并且以下字符串文字的开头引用将被视为缺少的引用引号。一旦引号不同步,词法扫描将继续错误,直到在假定的字符串文字内检测到文件结尾,此时可以报告错误。

C系列等语言不允许字符串文字包含换行符,这样可以提前检测到缺失的引号。在那种情况下,一个"坏"字符串文字是包含换行符的字符串。词汇扫描很可能错误地包含了字符串文字之外的字符,但错误恢复比错误引用有效地反转整个程序的语言更容易。

值得注意的是,在引用的字符串中意外地无法转义引用几乎是常见的,这将导致字符串文字过早关闭;然后将预期的收尾报价作为公开引用,并且最终的词汇错误将再次被延迟。

(F)lex使用"最长的匹配"规则来识别要识别的模式。如果字符串模式不允许换行符,如在C中,它可能是(在简化版本中,省略了转义的复杂性),如:

\"[^"]*\"

(记住在flex中,.与换行符不匹配。)如果行中没有结束引号,则此模式将不匹配,并且回退模式可能会成功,匹配只有公开报价。如果立即失败是可以接受的,那就足够了,但是如果你想进行错误恢复,你可能想要忽略剩下的行。在这种情况下,您可以添加一个模式,如

\"[^"]*

这也将匹配每个有效的字符串,当然(不包括结束引用)但它并不重要,因为有效的字符串文字模式匹配将更长(按一个字符)。所以没有结束引号的模式只匹配未终止的字符串文字。