\u000d
Побег заканчивается комментарий , потому что \u
побеги равномерно преобразуются в соответствующие символы Unicode , прежде чем программа лексемы. Вы могли бы также использовать \u0057\u0057
вместо того, //
чтобы начать комментарий.
Это ошибка в вашей IDE, которая должна синтаксически выделять строку, чтобы было ясно, что\u000d
комментарий заканчивается.
Это также ошибка дизайна в языке. Это не может быть исправлено сейчас, потому что это сломало бы программы, которые зависят от него. \u
escape-коды должны быть либо преобразованы компилятором в соответствующий символ Unicode только в тех случаях, когда это «имеет смысл» (строковые литералы и идентификаторы, и, вероятно, нигде больше), либо им должно быть запрещено генерировать символы в диапазоне U + 0000–007F. , или оба. Любая из этих семантик помешала бы завершению комментария \u000d
экранированием, не вмешиваясь в случаи, когда \u
экранирования полезны - обратите внимание, что это включает использование \u
экранирования внутри комментариев в качестве способа кодирования комментариев в нелатинском скрипте, потому что текстовый редактор может иметь более широкое представление о том, где\u
побеги важнее, чем компилятор. (Я не знаю ни о каком редакторе или IDE, которые будут отображать \u
экранирование как соответствующие символы в любом контексте.)
Существует аналогичная ошибка проектирования в семействе C, 1 когда обратная косая черта обрабатывается до определения границ комментариев, например,
// this is a comment \
this is still in the comment!
Я привожу это, чтобы проиллюстрировать, что бывает легко совершить эту конкретную ошибку проектирования, и не понимаю, что это ошибка, пока не стало слишком поздно ее исправлять, если вы привыкли думать о токенизации и разбирать способ, которым думают программисты компилятора о токенизации и разборе. По сути, если вы уже определили свою формальную грамматику, а затем кто-то придумает синтаксический особый случай - триграфы, обратную косую черту, кодирование произвольных символов Unicode в исходных файлах, ограниченных ASCII, что угодно, - что нужно вставить в код, проще добавьте проход преобразования перед токенизатором, чем переопределить токенизатор, чтобы обратить внимание на то, где имеет смысл использовать этот особый случай.
1 Для педантов: я знаю, что этот аспект C был на 100% преднамеренным, с обоснованием - я не придумываю это - что это позволило бы вам механически втиснуть код произвольно длинными линиями в перфокарты. Это было все еще неправильное дизайнерское решение.