ECMAScript | Литералы

ECMAScript | Литералы

12.8.1 Null литерал

Синтаксис

NullLiteral ::

null

 

12.8.2 Boolean литерал

Синтаксис

BooleanLiteral ::

true

false

 

12.8.3 Числовые литералы

Синтаксис

NumericLiteralSeparator ::

_

NumericLiteral ::

DecimalLiteral

DecimalBigIntegerLiteral

NonDecimalIntegerLiteral [+Sep]

NonDecimalIntegerLiteral [+Sep] BigIntLiteralSuffix

LegacyOctalIntegerLiteral

DecimalBigIntegerLiteral ::

0 BigIntLiteralSuffix

NonZeroDigit DecimalDigits [+Sep] opt BigIntLiteralSuffix

NonZeroDigit NumericLiteralSeparator DecimalDigits [+Sep] BigIntLiteralSuffix

NonDecimalIntegerLiteral [Sep] ::

BinaryIntegerLiteral [?Sep]

OctalIntegerLiteral [?Sep]

HexIntegerLiteral [?Sep]

BigIntLiteralSuffix ::

n

DecimalLiteral ::

DecimalIntegerLiteral . DecimalDigits [+Sep] opt ExponentPart [+Sep] opt

. DecimalDigits [+Sep] ExponentPart [+Sep] opt

DecimalIntegerLiteral ExponentPart [+Sep] opt

DecimalIntegerLiteral ::

0

NonZeroDigit

NonZeroDigit NumericLiteralSeparator opt DecimalDigits [+Sep]

NonOctalDecimalIntegerLiteral

DecimalDigits [Sep] ::

DecimalDigit

DecimalDigits [?Sep] DecimalDigit

[+Sep] DecimalDigits [+Sep] NumericLiteralSeparator DecimalDigit

DecimalDigit :: одно из

0 1 2 3 4 5 6 7 8 9

NonZeroDigit :: одно из

1 2 3 4 5 6 7 8 9

ExponentPart [Sep] ::

ExponentIndicator SignedInteger [?Sep]

ExponentIndicator :: один из

e E

SignedInteger [Sep] ::

DecimalDigits [?Sep]

+ DecimalDigits [?Sep]

DecimalDigits [?Sep]

BinaryIntegerLiteral [Sep] ::

0b BinaryDigits [?Sep]

0B BinaryDigits [?Sep]

BinaryDigits [Sep] ::

BinaryDigit

BinaryDigits [?Sep] BinaryDigit

[+Sep] BinaryDigits [+Sep] NumericLiteralSeparator BinaryDigit

BinaryDigit :: одно из

0 1

OctalIntegerLiteral [Sep] ::

0o OctalDigits [?Sep]

0O OctalDigits [?Sep]

OctalDigits [Sep] ::

OctalDigit

OctalDigits [?Sep] OctalDigit

[+Sep] OctalDigits [+Sep] NumericLiteralSeparator OctalDigit

LegacyOctalIntegerLiteral ::

0 OctalDigit

LegacyOctalIntegerLiteral OctalDigit

NonOctalDecimalIntegerLiteral ::

0 NonOctalDigit

LegacyOctalLikeDecimalIntegerLiteral NonOctalDigit

NonOctalDecimalIntegerLiteral DecimalDigit

LegacyOctalLikeDecimalIntegerLiteral ::

0 OctalDigit

LegacyOctalLikeDecimalIntegerLiteral OctalDigit

OctalDigit :: одно из

0 1 2 3 4 5 6 7

NonOctalDigit :: одно из

8 9

HexIntegerLiteral [Sep] ::

0x HexDigits [?Sep]

0X HexDigits [?Sep]

HexDigits [Sep] ::

HexDigit

HexDigits [?Sep] HexDigit

[+Sep] HexDigits [+Sep] NumericLiteralSeparator HexDigit

HexDigit :: одно из

0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

SourceCharacter, следующий сразу за NumericLiteral, не должен быть IdentifierStart или DecimalDigit.

Примечание

Например: 3in — это ошибка, а не два входных элемента 3 и in.

 

 

12.8.3.1 Статическая семантика: Ранние Ошибки

NumericLiteral :: LegacyOctalIntegerLiteral
DecimalIntegerLiteral :: NonOctalDecimalIntegerLiteral

  • Это синтаксическая ошибка, если исходный код, соответствующий этому продукту, является кодом строгого режима.

Примечание

В коде нестрогого режима этот синтаксис является Legacy (Наследие).

 

12.8.3.2 Статическая семантика: Математическое значение. MV — mathematical value

Числовой литерал обозначает значение типа Number или типа BigInt.

 

12.8.3.3 Статическая семантика: Числовое значение (NumericValue)

NumericLiteral :: DecimalLiteral

 RoundMVResult(MV of DecimalLiteral).

NumericLiteral :: NonDecimalIntegerLiteral

 𝔽(MV of NonDecimalIntegerLiteral).

NumericLiteral :: LegacyOctalIntegerLiteral

 𝔽(MV of LegacyOctalIntegerLiteral).

NumericLiteral :: NonDecimalIntegerLiteral BigIntLiteralSuffix

 the BigInt value that represents the MV of NonDecimalIntegerLiteral.

DecimalBigIntegerLiteral :: 0 BigIntLiteralSuffix

 0.

DecimalBigIntegerLiteral :: NonZeroDigit BigIntLiteralSuffix

 the BigInt value that represents the MV of NonZeroDigit.

DecimalBigIntegerLiteral ::NonZeroDigit DecimalDigits BigIntLiteralSuffixNonZeroDigit NumericLiteralSeparator DecimalDigits BigIntLiteralSuffix

Let n be the number of code points in DecimalDigits, excluding all occurrences of NumericLiteralSeparator.

Let mv be (the MV of NonZeroDigit × 10n) plus the MV of DecimalDigits.

Return (mv).

 

12.8.4 Строковые литералы

Примечание 1

Строковый литерал — это 0 или более кодовых точек Unicode, заключенных в одинарные или двойные кавычки. Кодовые точки Unicode также могут быть представлены escape-последовательностью. Все кодовые точки могут появляться буквально в строковом литерале, за исключением кодовых точек закрывающей кавычки, U+005C (REVERSE SOLIDUS), U+000D (CARRIAGE RETURN) и U+000A (LINE FEED). Любые кодовые точки могут появляться в виде escape-последовательности. Строковые литералы оцениваются как строковые значения ECMAScript. При генерации этих строковых значений кодовые точки Unicode кодируются в кодировке UTF-16, как определено в разделе 11.1.1. Кодовые точки, принадлежащие базовой многоязычной плоскости, кодируются как один элемент кодовой единицы строки. Все остальные кодовые точки кодируются как два элемента кодовой единицы строки.

 

Синтаксис строкового литерала

StringLiteral ::

" DoubleStringCharacters opt "

' SingleStringCharacters opt '

DoubleStringCharacters ::

DoubleStringCharacter DoubleStringCharacters opt

SingleStringCharacters ::

SingleStringCharacter SingleStringCharacters opt

DoubleStringCharacter ::

SourceCharacter но не один из « или \ или LineTerminator

<LS>

<PS>

\ EscapeSequence

LineContinuation

SingleStringCharacter ::

SourceCharacter но не один из или \ или LineTerminator

<LS>

<PS>

\ EscapeSequence

LineContinuation

LineContinuation ::

\ LineTerminatorSequence

EscapeSequence ::

CharacterEscapeSequence

0 [lookahead ∉ DecimalDigit]

LegacyOctalEscapeSequence

NonOctalDecimalEscapeSequence

HexEscapeSequence

UnicodeEscapeSequence

CharacterEscapeSequence ::

SingleEscapeCharacter

NonEscapeCharacter

SingleEscapeCharacter :: один из

‘ » \ b f n r t v

NonEscapeCharacter ::

SourceCharacter но не один из EscapeCharacter или LineTerminator

EscapeCharacter ::

SingleEscapeCharacter

DecimalDigit

x

u

LegacyOctalEscapeSequence ::

0 [lookahead ∈ { 89 }]

NonZeroOctalDigit [lookahead ∉ OctalDigit]

ZeroToThree OctalDigit [lookahead ∉ OctalDigit]

FourToSeven OctalDigit

ZeroToThree OctalDigit OctalDigit

NonZeroOctalDigit ::

OctalDigit но не 0

ZeroToThree :: один из

0 1 2 3

FourToSeven :: один из

4 5 6 7

NonOctalDecimalEscapeSequence :: один из

8 9

HexEscapeSequence ::

x HexDigit HexDigit

UnicodeEscapeSequence ::

u Hex4Digits

u{ CodePoint }

Hex4Digits ::

HexDigit HexDigit HexDigit HexDigit

Определение нетерминального HexDigit дано в разделе 12.8.3. SourceCharacter определен в разделе 11.1.

Примечание 2

<LF> и <CR> не могут появляться в строковом литерале, кроме как как часть LineContinuation для создания пустой последовательности кодовых точек. Правильный способ включить любое из значений String строкового литерала — использовать escape-последовательность, например \n или \u000A.

 

12.8.4.1 Статическая семантика: Ранние Ошибки

EscapeSequence :: LegacyOctalEscapeSequence

EscapeSequence :: NonOctalDecimalEscapeSequence

  • Это синтаксическая ошибка, если исходный код, соответствующий этому продукту, является кодом строгого режима.
Примечание 1

В нестрогом коде это синтаксис Legacy.

Примечание 2

Строковые литералы могут предшествовать директиве Use Strict, которая переводит включающий код в строгий режим, и реализации должны позаботиться о соблюдении вышеуказанных правил для таких литералов. Например, следующий исходный текст содержит синтаксическую ошибку:

function invalid() { "\7"; "use strict"; }

 

12.8.4.2 Статическая семантика: Строковые значения. SV — String values

Строковый литерал обозначает значение типа String. SV создаёт строковые значения (String Values) для строковых литералов посредством рекурсивного применения к различным частям строкового литерала. В рамках этого процесса некоторые кодовые точки Unicode в строковом литерале интерпретируются как имеющие математическое значение, как описано ниже или в разделе 12.8.3.

Escape Sequence (Последовательность побега) Code Unit Value ( Значение Кодовой Единицы) Unicode Character Name (Имя символа Юникода) Symbol (Символ)
\b 0x0008 BACKSPACE <BS>
\t 0x0009 CHARACTER TABULATION <HT>
\n 0x000A LINE FEED (LF) <LF>
\v 0x000B LINE TABULATION <VT>
\f 0x000C FORM FEED (FF) <FF>
\r 0x000D CARRIAGE RETURN (CR) <CR>
0x0022 QUOTATION MARK «
\’ 0x0027 APOSTROPHE
\\ 0x005C REVERSE SOLIDUS \

Таблица 40: Последовательности перехода из одного символа в строку

 

12.8.4.3 Статическая семантика: MV

 

 

12.8.5 Литералы регулярных выражений

Примечание 1

Литерал регулярного выражения — это входной элемент, который преобразуется в объект RegExp (смотри раздел 22.2) каждый раз, когда вычисляется литерал. Два литерала регулярного выражения в программе оценивают объекты регулярного выражения, которые никогда не сравниваются как === друг с другом, даже если содержимое двух литералов идентично. Объект RegExp также может быть создан во время выполнения с помощью new RegExp или вызова конструктора RegExp как функции (смотри раздел 22.2.3).

Приведенные ниже инструкции описывают синтаксис литерала регулярного выражения и используются сканером входных элементов для поиска конца литерала регулярного выражения. Исходный текст, содержащий RegularExpressionBody и RegularExpressionFlags, впоследствии снова анализируется с использованием более строгой грамматики регулярных выражений ECMAScript (22.2.1).

Реализация может расширять грамматику регулярных выражений ECMAScript, определенную в 22.2.1, но она не должна расширять продукты RegularExpressionBody и RegularExpressionFlags, определенные ниже, или продукты, используемые этими продуктами.

Синтаксис литерала регулярного выражения

RegularExpressionLiteral ::

/ RegularExpressionBody / RegularExpressionFlags

RegularExpressionBody ::

RegularExpressionFirstChar RegularExpressionChars

RegularExpressionChars ::

[empty]

RegularExpressionChars RegularExpressionChar

RegularExpressionFirstChar ::

RegularExpressionNonTerminator но не одно из * или \ или / или [

RegularExpressionBackslashSequence

RegularExpressionClass

RegularExpressionChar ::

RegularExpressionNonTerminator но не одно из \ или / или [

RegularExpressionBackslashSequence

RegularExpressionClass

RegularExpressionBackslashSequence ::

\ RegularExpressionNonTerminator

RegularExpressionNonTerminator ::

SourceCharacter но не LineTerminator

RegularExpressionClass ::

[ RegularExpressionClassChars ]

RegularExpressionClassChars ::

[empty]

RegularExpressionClassChars RegularExpressionClassChar

RegularExpressionClassChar ::

RegularExpressionNonTerminator но не один из ] или \

RegularExpressionBackslashSequence

RegularExpressionFlags ::

[empty]

RegularExpressionFlags IdentifierPart

Примечание 2

Литералы регулярных выражений не могут быть пустыми; вместо представления пустого литерала регулярного выражения последовательность кодовых единиц // начинает однострочный комментарий. Чтобы указать пустое регулярное выражение, используйте: /(?:)/.

 

12.8.5.1 Статическая семантика: ранние ошибки

RegularExpressionFlags :: RegularExpressionFlags IdentifierPart

  • Это синтаксическая ошибка, если IdentifierPart содержит escape-последовательность Unicode.

12.8.5.2 Статическая семантика: BodyText

RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags

1. Верните исходный текст, который был распознан как RegularExpressionBody.

12.8.5.3 Статическая семантика: FlagText

RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags

1. Верните исходный текст, который был распознан как RegularExpressionFlags.

12.8.6 Лексические компоненты литерала Шаблона

Синтаксис

Template ::

NoSubstitutionTemplate

TemplateHead

NoSubstitutionTemplate ::

` TemplateCharacters opt `

TemplateHead ::

` TemplateCharacters opt ${

TemplateSubstitutionTail ::

TemplateMiddle

TemplateTail

TemplateMiddle ::

} TemplateCharacters opt ${

TemplateTail ::

} TemplateCharacters opt `

TemplateCharacters ::

TemplateCharacter TemplateCharacters opt

TemplateCharacter ::

$ [lookahead ≠ {]

\ TemplateEscapeSequence

\ NotEscapeSequence

LineContinuation

LineTerminatorSequence

SourceCharacter но не один из ` или \ или $ или LineTerminator

TemplateEscapeSequence ::

CharacterEscapeSequence

0 [lookahead ∉ DecimalDigit]

HexEscapeSequence

UnicodeEscapeSequence

NotEscapeSequence ::

0 DecimalDigit

DecimalDigit но не 0

x [ lookahead ∉ HexDigit ]

x HexDigit [ lookahead ∉ HexDigit ]

u [ lookahead ∉ HexDigit ] [ lookahead ≠ { ]

u HexDigit [ lookahead ∉ HexDigit ]

u HexDigit HexDigit [ lookahead ∉ HexDigit ]

u HexDigit HexDigit HexDigit [ lookahead ∉ HexDigit ]

u { [ lookahead ∉ HexDigit ]

u { NotCodePoint [ lookahead ∉ HexDigit ]

u { CodePoint [ lookahead ∉ HexDigit ] [ lookahead ≠ } ]

NotCodePoint ::

HexDigits [~Sep] но только если математическое значение из HexDigits > 0x10FFFF

CodePoint ::

HexDigits [~Sep] но только если математическое значение из HexDigits ≤ 0x10FFFF

Примечание

TemplateSubstitutionTail используется альтернативной лексической целью InputElementTemplateTail.

 

 

12.8.6.1 Статическая семантика: Шаблонное Значение. TV — Template Value

Компонент литерала шаблона интерпретируется шаблонным значением (TV- Template Value) как значение типа String. TV используется для создания индексированных компонентов объекта шаблона (в просторечии значений шаблона). На телевидении escape-последовательности заменяются кодовыми единицами UTF-16 кодовой точки Unicode, представленной escape-последовательностью.

 

12.8.6.2 Статическая семантика: Исходные Значения Шаблона. TRV — template raw values

Компонент литерала шаблона интерпретируется TRV как значение типа String. TRV используется для создания необработанных компонентов объекта-шаблона (в просторечии — необработанных значений шаблона). TRV похож на TV с той разницей, что в TRV escape-последовательности интерпретируются так, как они появляются в литерале.

Примечание

TV (template value) исключает кодовые единицы LineContinuation, в то время как TRV (template raw value) включает их. <CR><LF> и <CR>LineTerminatorSequence нормализованы до <LF> как для TV, так и для TRV. Явная последовательность TemplateEscapeSequence необходима для включения последовательности <CR> или <CR><LF>.

 

Информационные ссылки

ECMAScript | Язык ECMAScript: лексическая грамматика

Стандарт ECMAScript — Раздел «12.8 Literals» — https://tc39.es/ecma262/#sec-ecmascript-language-lexical-grammar-literals