如何在柔性扫描仪中扫描“字符串”常量?
答
字符串文字可能是“不好”的唯一方法是如果它缺少结束引号。不幸的是,这并不容易检测到,因为程序中可能还有另一个字符串字符串,并且以下字符串文字的开头引号将被视为缺少关闭引号。一旦引号不同步,词法扫描将不正确地继续,直到在假定的字符串文字内检测到文件末尾,此时可报告错误。
像C系列这样的语言不允许字符串文字包含换行符,这允许提前检测到缺少的引号。在这种情况下,“坏”字符串文字是包含换行符的文字。词法扫描很可能会错误地包含字符串以外的字符,但错误恢复比缺少引号有效地反转整个程序的语言要容易一些。
值得注意的是,在引用的字符串中意外地失败转义,这将导致字符串过早关闭;原计划的近似报价将作为公开报价松散,最终的词汇错误将再次延迟。 (F)lex使用“最长匹配”规则来确定识别哪种模式。如果字符串模式不允许换行,如C,它可能是(在一个简化版本,而忽略了逃逸的复杂性)类似:
\"[^"]*\"
(记住,在柔性,.
不匹配换行符)。如果结束行情不在行中,则此模式不匹配,并且回滚模式很可能会成功,只匹配公开报价。如果立即失败是可以接受的,那已经足够了,但如果您想要进行错误恢复,您可能需要忽略该行的其余部分。在这种情况下,您可以添加一个模式,如
\"[^"]*
这将每一个有效的字符串匹配,以及,当然(不包括闭引号),但它并不重要,因为有效的字符串文字模式的匹配将更长(一个字符)。所以没有结尾引用的模式只会匹配未终止的字符串文字。
不是你在这个问题上看到的典型评论,但你有什么尝试? – lintmouse
帮助使用帮助你!至少:展示你的努力,包括示例输入和输出。 –