在 java 或 scala 中,在单引号内声明一个字符串会抛出
'错误:未闭合的字符文字'
我想知道是否有人可以告诉我编译器如何对单引号内的字符串进行类型检查然后确定错误的确切机制。另外,为什么编译器会说'
未闭合字符文字
' 代替
“字符串而不是字符”
作为错误描述?
谢谢
在 java 或 scala 中,在单引号内声明一个字符串会抛出
'错误:未闭合的字符文字'
我想知道是否有人可以告诉我编译器如何对单引号内的字符串进行类型检查然后确定错误的确切机制。另外,为什么编译器会说'
未闭合字符文字
' 代替
“字符串而不是字符”
作为错误描述?
谢谢
由于我不详细了解编译器是如何工作的,我只能猜测:
在词法分析期间,当编译器看到'
它已经知道的开始时,它正在读取字符文字。所以它需要一个字符(或代表一个字符的转义序列,如\n
),然后是一个结束符'
。当'
未找到关闭消息时
error: unclosed character literal
才有意义。
这通常由词法分析器完成。正如维基百科文章所说,这通常由有限状态机完成,它非常快速且易于生成。
至于为什么它显示“未封闭的字符文字”而不是“字符串而不是字符”是因为通常解析语言的方式(与词法分析不同的步骤)使得编译器更难实现程序员的意图比一个人看着它。编译器使用的上下文通常是问题部分的左侧和上方,而不是整个上下文。
所以,看开引号的左边,无法判断错误是缺少单引号,还是程序员将单引号和双引号混用了。在 Scala 中,符号的语法 ( 'aSymbol
) 使这一点更加复杂,这阻止了它使用下一个字符作为区分一个字符的一种方式。
因此,最后,选择错误消息以反映最可能的错误,并且对于来自 Java、C 或 C++ 的任何人来说,在字符串周围使用单引号并不是一种习惯。对于来自 Ruby、Perl 或 Python 等脚本语言的人来说,这是另一回事。
编译器期望文字中只有一个字符(除非它是转义字符。之后唯一有效的字符是结束单引号。如果不存在,则会给出该错误。
编译器无法读懂你的想法并且知道真正的问题出在单引号上。它假定您知道自己在做什么,并报告它实际看到的第一个错误。