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

问题描述:

作为创建Flex扫描器的类分配的一部分,我需要创建一个识别字符串常量的规则。也就是说,一组引号之间的字符集合。我如何识别坏字符串?如何在柔性扫描仪中扫描“字符串”常量?

+0

不是你在这个问题上看到的典型评论,但你有什么尝试? – lintmouse

+0

帮助使用帮助你!至少:展示你的努力,包括示例输入和输出。 –

字符串文字可能是“不好”的唯一方法是如果它缺少结束引号。不幸的是,这并不容易检测到,因为程序中可能还有另一个字符串字符串,并且以下字符串文字的开头引号将被视为缺少关闭引号。一旦引号不同步,词法扫描将不正确地继续,直到在假定的字符串文字内检测到文件末尾,此时可报告错误。

像C系列这样的语言不允许字符串文字包含换行符,这允许提前检测到缺少的引号。在这种情况下,“坏”字符串文字是包含换行符的文字。词法扫描很可能会错误地包含字符串以外的字符,但错误恢复比缺少引号有效地反转整个程序的语言要容易一些。

值得注意的是,在引用的字符串中意外地失败转义,这将导致字符串过早关闭;原计划的近似报价将作为公开报价松散,最终的词汇错误将再次延迟。 (F)lex使用“最长匹配”规则来确定识别哪种模式。如果字符串模式不允许换行,如C,它可能是(在一个简化版本,而忽略了逃逸的复杂性)类似:

\"[^"]*\" 

(记住,在柔性,.不匹配换行符)。如果结束行情不在行中,则此模式不匹配,并且回滚模式很可能会成功,只匹配公开报价。如果立即失败是可以接受的,那已经足够了,但如果您想要进行错误恢复,您可能需要忽略该行的其余部分。在这种情况下,您可以添加一个模式,如

\"[^"]* 

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