The \u000d
melarikan diri berakhir komentar karena \u
lolos secara seragam diubah ke karakter Unicode yang sesuai sebelum program ini tokenized. Anda bisa menggunakan keduanya \u0057\u0057
sebagai ganti //
untuk memulai komentar.
Ini adalah bug di IDE Anda, yang seharusnya menyoroti garis untuk membuat jelas bahwa\u000d
mengakhiri komentar.
Ini juga merupakan kesalahan desain dalam bahasa. Itu tidak dapat diperbaiki sekarang, karena itu akan merusak program yang bergantung padanya. \u
escapes harus dikonversi ke karakter Unicode yang sesuai dengan kompilator hanya dalam konteks di mana "masuk akal" (string literal dan pengidentifikasi, dan mungkin tidak ada di tempat lain) atau mereka seharusnya dilarang untuk menghasilkan karakter dalam kisaran U + 0000–007F , atau keduanya. Salah satu dari semantik itu akan mencegah komentar dihentikan oleh \u000d
pelarian, tanpa mengganggu kasus-kasus di mana \u
pelarian berguna - perhatikan bahwa itu termasuk penggunaan \u
pelarian di dalam komentar sebagai cara untuk menyandikan komentar dalam skrip non-Latin, karena editor teks bisa mengambil pandangan yang lebih luas dari mana\u
escapes lebih penting daripada kompiler. (Saya tidak mengetahui ada editor atau IDE yang akan menampilkan \u
lolos sebagai karakter yang sesuai dalam apa pun konteksnya.)
Ada kesalahan desain yang serupa dalam keluarga C, 1 di mana backslash-newline diproses sebelum batas komentar ditentukan, jadi misalnya
// this is a comment \
this is still in the comment!
Saya membawa ini untuk menggambarkan bahwa itu mudah untuk membuat kesalahan desain khusus ini, dan tidak menyadari bahwa itu adalah kesalahan sampai sudah terlambat untuk memperbaikinya, jika Anda terbiasa berpikir tentang tokenization dan menguraikan cara programmer compiler berpikir tentang tokenization dan parsing. Pada dasarnya, jika Anda telah mendefinisikan tata bahasa formal Anda dan kemudian seseorang membuat kasus khusus sintaksis - trigraph, backslash-newline, pengkodean karakter Unicode yang sewenang-wenang dalam file sumber terbatas pada ASCII, apa pun - yang perlu dijepit, lebih mudah untuk tambahkan pass transformasi sebelum tokenizer daripada mendefinisikan ulang tokenizer untuk memperhatikan di mana masuk akal untuk menggunakan case khusus itu.
1 Untuk para pengendara: Saya tahu bahwa aspek C ini 100% disengaja, dengan alasan - Saya tidak mengada-ada - bahwa itu akan memungkinkan Anda untuk secara mekanis mencocokkan kode dengan garis panjang sewenang-wenang ke kartu berlubang. Itu masih keputusan desain yang salah.