在 java 或 scala 中,在单引号内声明字符串会抛出
'error: unclosed character literal'
我想知道是否有人可以告诉我编译器如何对单引号内的字符串进行类型检查,然后确定错误的确切机制。另外,为什么编译器会说 '
unclosed character literal
' 而不是
"String instead of char"
作为错误描述?
谢谢
最佳答案
这通常由 lexical analyser 完成。正如维基百科文章所说,这通常是由 finite-state machine 完成的。 ,它们非常快速且易于生成。
至于为什么它显示“未封闭的字 rune 字”而不是“字符串而不是字符”,是因为通常解析语言的方式(与词法分析不同的步骤)使编译器更难实现程序员的意图对于一个看着它的人来说。编译器使用的上下文通常是有问题的部分的左侧和上方,而不是整个上下文。
因此,查看左引号的左侧,无法判断错误是缺少单引号,还是程序员将单引号与双引号混合在一起。在 Scala 中,这是由符号语法 ('aSymbol
) 复合而成的,它阻止它使用下一个字符作为区分彼此的一种方式。
所以,最后,错误消息被选择来反射(reflect)最可能的错误,并且,对于来自 Java、C 或 C++ 的任何人来说,在字符串周围使用单引号并不是一种习惯。对于使用 Ruby、Perl 或 Python 等脚本语言的人来说,那就是另一回事了。
关于java - 未封闭字 rune 字背后的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14807767/