Java または scala で、一重引用符で囲まれた文字列を宣言すると、
「エラー: 文字リテラルが閉じられていません」
一重引用符内の文字列がコンパイラによってどのように型チェックされ、エラーの判定が行われるかについて、誰かが正確なメカニズムを教えてくれるかどうか疑問に思っていました。また、なぜコンパイラは「
閉じていない文字リテラル
' それ以外の
「文字ではなく文字列」
エラーの説明として?
ありがとう
Java または scala で、一重引用符で囲まれた文字列を宣言すると、
「エラー: 文字リテラルが閉じられていません」
一重引用符内の文字列がコンパイラによってどのように型チェックされ、エラーの判定が行われるかについて、誰かが正確なメカニズムを教えてくれるかどうか疑問に思っていました。また、なぜコンパイラは「
閉じていない文字リテラル
' それ以外の
「文字ではなく文字列」
エラーの説明として?
ありがとう
コンパイラがどのように機能するかについて詳しく知らないので、推測することしかできません。
字句解析中に、コンパイラーが開始'
を確認すると、文字リテラルを読み取っていることが既にわかっています。したがって、1 つの文字 (または のような 1 文字を表すエスケープ シーケンス\n
) と、終了する'
. クロージング'
が見つからない場合のメッセージ
error: unclosed character literal
理にかなっています。
これは通常、字句解析器によって行われます。ウィキペディアの記事にあるように、これは通常、非常に高速で簡単に生成できる有限状態マシンによって行われます。
「文字ではなく文字列」ではなく「閉じられていない文字リテラル」を表示する理由は、言語が通常解析される方法 (字句解析とは異なるステップ) により、コンパイラーがプログラマーが意図したことを人よりも理解するのがはるかに難しくなるためです。それを見ています。コンパイラが使用するコンテキストは、通常、コンテキスト全体ではなく、問題のある部分の左側と上部にあるものです。
したがって、開始引用符の左側を見ると、エラーが一重引用符の欠落なのか、それともプログラマーが一重引用符と二重引用符を混在させたのかを判断することは不可能です。これは、Scala では記号 ( 'aSymbol
) の構文によって複雑になり、次の文字を区別する方法として使用することができなくなります。
したがって、最終的に、エラー メッセージは最も可能性の高いエラーを反映するように選択されます。Java、C、または C++ から来た人にとって、文字列を一重引用符で囲むことは習慣ではありません。Ruby、Perl、Python などのスクリプト言語から来た人々にとって、それはまた別の話です。
コンパイラは、リテラル内に正確に 1 文字を期待します (エスケープでない限り)。その後、唯一の有効な文字は終了の一重引用符です。そこにない場合は、そのエラーが発生します。
コンパイラはあなたの心を読むことができず、本当の問題が一重引用符に戻ったことを知ることができません. 自分が何をしていたかを知っていると仮定し、実際に見た最初のエラーを報告します。