ECMAScript 2017: почему EscapeSequence включает NonEscapeCharacter?

Приведенные ниже выдержки относятся к ECMAScript 2017.

11.8.4 Строковые литералы, примечание 1

Строковый литерал — это ноль или более кодовых точек Unicode, заключенных в одинарные или двойные кавычки. Кодовые точки Unicode также могут быть представлены escape-последовательностью. .... Любые кодовые точки могут появляться в виде управляющей последовательности.

11.8.4 Строковые литералы, синтаксис

Нетерминальный символ EscapeSequence имеет следующую лексическую грамматическую продукцию:

EscapeSequence ::
    CharacterEscapeSequence
    0 [lookahead ∉ DecimalDigit]
    HexEscapeSequence
    UnicodeEscapeSequence

Нетерминальный символ CharacterEscapeSequence имеет следующую лексическую грамматическую продукцию:

CharacterEscapeSequence ::
    SingleEscapeCharacter
    NonEscapeCharacter

11.8.4.3 Статическая семантика: SV

Содержит такие описания, как:

SV DoubleStringCharacter::\EscapeSequence — это SV EscapeSequence.

Вопросы

  1. Что означает escape sequence в примечании 1? Попытка понять, что на самом деле делает управляющая последовательность, а не только ее лексическая грамматика.
  2. Почему CharacterEscapeSequence включает NonEscapeCharacter?
  3. Описания в 11.8.4.3 Статическая семантика : SV, похоже, не следует обычному соглашению ECMAScript для создания лексической грамматики. Что подразумевается под этими описаниями?
  4. Добавлен вопрос: указано ли в примечании 1, что кодовые точки могут быть в кавычках или, альтернативно, после escape-последовательности (например, обратной косой черты)? Это то, что подразумевается под Any code points may appear in the form of an escape sequence?

person Magnus    schedule 02.04.2018    source источник


Ответы (1)


  1. #P1#
    #P2#
  2. #P3#
    #P4#
  3. #P5#
    #P6#
    #P7#
person Community    schedule 02.04.2018
comment
Спасибо, Райан. Согласно Q3, говорится ли в спецификации, что лексическая грамматическая продукция DoubleStringCharacter :: \ EscapeSequence имеет строковое значение? У меня немного проблемы с пониманием того, что он говорит. Кроме того, 11.8.4.2, похоже, определяет StringValue как StringLiteral. Там написано что-то, чего я тоже не понимаю: Return the String value whose elements are the SV of this StringLiteral.. Есть какие-нибудь мысли? Спасибо еще раз. - person Magnus; 02.04.2018
comment
В качестве предупреждения: я добавил некоторые пояснения и дополнительный вопрос к ОП. - person Magnus; 02.04.2018
comment
@Magnus: Да, это говорит о том, что DoubleStringCharacter имеет строковое значение, определяемое тем, с чем оно совпало. Строковое значение литерала — это строка (примитивного типа), «строковое значение», элементы которой определяются конкатенацией SV частей литерала. - person Ry-♦; 02.04.2018
comment
@Magnus: А что касается вопроса 4: да, это означает, что "a" (содержащий кодовую точку a) также может быть представлен escape-последовательностью как "\x61". - person Ry-♦; 02.04.2018
comment
Еще раз спасибо, Райан. Что произойдет, если у меня есть строковый литерал abc xyz? Согласно 10.1 escape sequence occurring within a string literal in an ECMAScript program always contributes to the literal and is never interpreted as a line terminator. Однако 11.8.4. (и ваш пример x61), кажется, указывает на то, что escape-последовательность будет интерпретирована. - person Magnus; 02.04.2018
comment
Последняя запутанная часть — это разница между: string literal, String value и SV. Кажется, что string literal представляет значение типа String. Это значение называется String value и обозначается аббревиатурой SV. Если SV длиннее одной кодовой точки, она будет состоять из нескольких меньших SV (до одной кодовой точки каждая). Это правильно? - person Magnus; 02.04.2018
comment
@Magnus: escape-последовательность будет интерпретироваться как строковое значение; не вижу никакого противоречия. SV может быть как длиннее одной кодовой единицы UTF-16, так и длиннее одной кодовой точки. Не думаю, что имеет смысл говорить, что он состоит из более мелких КА. - person Ry-♦; 02.04.2018
comment
Интерпретируя как строковое значение, вы имеете в виду, что оно буквально будет продолжать говорить в середине? Это не вызовет какого-то разрыва строки после abc, учитывая, что x000A - это Unicode для перевода строки? - person Magnus; 02.04.2018
comment
@Magnus: Нет, я имею в виду, что разрыв строки является частью строкового значения. - person Ry-♦; 02.04.2018
comment
Спасибо за всю помощь, Райан. Чтобы не загромождать пост, я опубликую новый конкретный вопрос по двум темам, которые все еще кажутся запутанными. - person Magnus; 02.04.2018