作为创建flex扫描程序的类分配的一部分,我需要创建一个识别字符串常量的规则。也就是说,一组引号之间的字符集合。如何识别坏字符串?
答案 0 :(得分:0)
字符串文字的唯一方法是" bad"如果它缺少结束引号。遗憾的是,这并不容易检测,因为程序中可能存在另一个字符串文字,并且以下字符串文字的开头引用将被视为缺少的引用引号。一旦引号不同步,词法扫描将继续错误,直到在假定的字符串文字内检测到文件结尾,此时可以报告错误。
C系列等语言不允许字符串文字包含换行符,这样可以提前检测到缺失的引号。在那种情况下,一个"坏"字符串文字是包含换行符的字符串。词汇扫描很可能错误地包含了字符串文字之外的字符,但错误恢复比错误引用有效地反转整个程序的语言更容易。
值得注意的是,在引用的字符串中意外地无法转义引用几乎是常见的,这将导致字符串文字过早关闭;然后将预期的收尾报价作为公开引用,并且最终的词汇错误将再次被延迟。
(F)lex使用"最长的匹配"规则来识别要识别的模式。如果字符串模式不允许换行符,如在C中,它可能是(在简化版本中,省略了转义的复杂性),如:
\"[^"]*\"
(记住在flex中,.
与换行符不匹配。)如果行中没有结束引号,则此模式将不匹配,并且回退模式可能会成功,匹配只有公开报价。如果立即失败是可以接受的,那就足够了,但是如果你想进行错误恢复,你可能想要忽略剩下的行。在这种情况下,您可以添加一个模式,如
\"[^"]*
这也将匹配每个有效的字符串,当然(不包括结束引用)但它并不重要,因为有效的字符串文字模式匹配将更长(按一个字符)。所以没有结束引号的模式只匹配未终止的字符串文字。