我在 goyacc 程序的 cpyact 函数中遇到了这段代码。当我们看到以 " 或 ' 开头的字符串文字时,我们只需复制它们。但是对 "\" 和 " 的处理 ” 看起来很奇怪。为什么我们关心“\ " 序列?与 C 字符串有关吗?因为 goyacc 源自 Inferno 的 utils/iyacc/yacc.c
case '\'', '"':
// character string or constant
match := c
fcode.WriteRune(c)
c = getrune(finput)
for c != EOF {
if c == '\\' {
fcode.WriteRune(c)
c = getrune(finput)
if c == '\n' { // does it mean "ab\\\ncd" is ok?
lineno++
}
} else if c == match {
break swt
}
if c == '\n' {// does it mean "ab\n" is NOT ok?
errorf("newline in string")
}
fcode.WriteRune(c)
c = getrune(finput)
}
该代码并不意味着“ab\ cd”是可以接受的,但是“ab " 不是。第一种情况的形式为:
"ab\
cd"
第二种情况的形式为
"ab
cd"
当文字想要换行符时需要 \。