未闭合字符文字背后的算法



在java或scala中,在单引号内声明字符串会引发

"错误:未关闭的字符文字"

我想知道是否有人能告诉我编译器如何对单引号中的字符串进行类型检查,然后确定错误的确切机制。此外,为什么编译器会说"

未闭合字符文字

'而不是

"字符串而非字符"

作为错误描述?

感谢

这通常由词法分析器完成。正如维基百科的文章所说,这通常是由一个有限状态机完成的,它非常快速且易于生成。

至于为什么它显示"未闭合字符文字"而不是"字符串而不是字符",是因为语言通常的解析方式(与词法分析不同的步骤)使编译器比查看它的人更难实现程序员的意图。编译器使用的上下文通常位于问题部分的左侧和上方,而不是整个上下文。

因此,从左引号看,无法判断错误是缺少单引号,还是程序员将单引号和双引号混合在一起。在Scala中,符号的语法('aSymbol)使这一点更加复杂,这阻止了它使用下一个字符来区分两者。

因此,最终,选择错误消息来反映最有可能的错误,对于来自Java、C或C++的任何人来说,在字符串周围使用单引号都不是一种习惯。对于来自Ruby、Perl或Python等脚本语言的人来说,这是另一回事。

由于我不知道编译器的详细工作原理,我只能猜测:

在词法分析过程中,当编译器看到启动的'时,它已经知道它正在读取一个字符文字。因此,它期望一个字符(或表示一个字符的转义序列,如n),然后是一个结束的'。当未找到关闭的'时,消息

error: unclosed character literal

这很有道理。

编译器要求文本中只有一个字符(除非它是转义符。之后,唯一有效的字符是右单引号。如果不存在,则会给出错误。

编译器不能读懂你的心思,知道真正的问题又回到了一句话。它假设你知道自己在做什么,并报告它实际看到的第一个错误。

最新更新