2013-02-11 14 views
0

在Java或Scala中聲明單引號內的字符串將拋出算法背後沒有結束的字符文字

'error: unclosed character literal'

我想知道是否有人能告訴我的單引號內的字符串是如何類型的確切機制由編譯器檢查,然後確定錯誤。另外,爲什麼編譯器說 '

unclosed character literal

',而不是

"String instead of char"

爲錯誤的描述?

感謝

回答

2

這通常由lexical analyser完成。正如維基百科文章所說,這通常是由finite-state machine完成的,它非常快速且易於生成。

至於爲什麼它顯示「unclosed character literal」而不是「字符串而不是char」是因爲語言通常被解析的方式(與詞法分析不同的一個步驟)使得編譯器難以實現程序員的意圖而不是一個人看着它。編譯器使用的上下文通常是左側和上方有問題的部分,而不是整個上下文。

因此,在開頭引號的左側,無法確定錯誤是否缺少單引號,或者程序員是否將單引號與雙引號混合在一起。這在Scala中通過符號的語法('aSymbol)複雜化,阻止它使用下一個字符作爲區分彼此的方式。

因此,最終會選擇錯誤消息來反映最可能出現的錯誤,對於來自Java,C或C++的任何人,使用字符串周圍的單引號不是一種習慣。對於來自諸如Ruby,Perl或Python等腳本語言的人來說,這是另一回事。

+0

https://issues.scala-lang.org/browse/SI-10120建議''abc''的字符串語法。 – 2017-01-08 16:41:32

2

因爲我不知道具體的編譯器是如何工作的,我只能猜測:

在詞法分析,當編譯器看到起始'它已經知道,它是閱讀一個字符字面。所以它期望一個字符(或代表一個字符的轉義序列,如\n),然後關閉'。當關閉'沒有找到消息

error: unclosed character literal 

很有道理。

0

編譯器期望的是一個字符內的文字(除非它是一種逃避。在此之後,唯一有效的字符是關閉單引號。如果它不存在,它給這個錯誤。

編譯器無法讀懂你的想法,並且知道真正的問題回到了單引號中,它假定你知道你在做什麼,並報告它實際上看到的第一個錯誤。