← ECMAScript 2027 · İçindekiler
ECMA-262 · 18inci Baskı
12

ECMAScript Dili: Sözcüksel Dilbilgisi

Bir ECMAScript Script'inin veya Module'ünün kaynak metni, önce belirteçler, satır sonlandırıcılar, yorumlar veya boşluk olan girdi öğeleri dizisine dönüştürülür. Kaynak metin soldan sağa taranır ve bir sonraki girdi öğesi olarak mümkün olan en uzun kod noktası dizisi tekrar tekrar alınır.

Sözcüksel girdi öğelerinin tanımlanmasının, girdi öğelerini tüketen sözdizimsel dilbilgisi bağlamına duyarlı olduğu birkaç durum vardır. Bu, sözcüksel dilbilgisi için birden fazla hedef sembolü gerektirir. InputElementHashbangOrRegExp hedefi, bir Script veya Module'ün başlangıcında kullanılır. InputElementRegExpOrTemplateTail hedefi, bir RegularExpressionLiteral, bir TemplateMiddle veya bir TemplateTail'e izin verilen sözdizimsel dilbilgisi bağlamlarında kullanılır. InputElementRegExp hedef sembolü, bir RegularExpressionLiteral'e izin verilen ancak ne bir TemplateMiddle ne de bir TemplateTail'e izin verilen tüm sözdizimsel dilbilgisi bağlamlarında kullanılır. InputElementTemplateTail hedefi, bir TemplateMiddle veya bir TemplateTail'e izin verilen ancak bir RegularExpressionLiteral'e izin verilmeyen tüm sözdizimsel dilbilgisi bağlamlarında kullanılır. Diğer tüm bağlamlarda, sözcüksel hedef sembolü olarak InputElementDiv kullanılır.

Sözdizimi

InputElementDiv InputElementDiv :: WhiteSpace LineTerminator Comment CommonToken DivPunctuator RightBracePunctuator

InputElementRegExp InputElementRegExp :: WhiteSpace LineTerminator Comment CommonToken RightBracePunctuator RegularExpressionLiteral

InputElementRegExpOrTemplateTail InputElementRegExpOrTemplateTail :: WhiteSpace LineTerminator Comment CommonToken RegularExpressionLiteral TemplateSubstitutionTail

InputElementTemplateTail InputElementTemplateTail :: WhiteSpace LineTerminator Comment CommonToken DivPunctuator TemplateSubstitutionTail

InputElementHashbangOrRegExp InputElementHashbangOrRegExp :: WhiteSpace LineTerminator Comment CommonToken HashbangComment RegularExpressionLiteral

12.1 Unicode Biçim Denetim Karakterleri

Unicode biçim denetim karakterleri (yani, Unicode Karakter Veritabanı'nda "Cf" kategorisindeki LEFT-TO-RIGHT MARK veya RIGHT-TO-LEFT MARK gibi karakterler), bunun için daha üst düzey protokollerin (işaretleme dilleri gibi) yokluğunda bir metin aralığının biçimlendirmesini denetlemek için kullanılan denetim kodlarıdır.

Kaynak metinde biçim denetim karakterlerine, düzenleme ve görüntülemeyi kolaylaştırmak için izin vermek yararlıdır. Tüm biçim denetim karakterleri, yorumlar içinde ve dizgi değişmezleri, şablon değişmezleri ve düzenli ifade değişmezleri içinde kullanılabilir.

U+FEFF (SIFIR GENİŞLİKLİ KESİNTİSİZ BOŞLUK), öncelikle bir metnin başlangıcında onu Unicode olarak işaretlemek ve metnin kodlamasının ve bayt sıralamasının tespitine izin vermek için kullanılan bir biçim denetim karakteridir. Bu amaç için tasarlanmış karakterleri bazen metnin başlangıcından sonra da, örneğin dosyaların birleştirilmesinin bir sonucu olarak görünebilir. ECMAScript kaynak metninde kod noktaları, yorumlar, dizgi değişmezleri, şablon değişmezleri ve düzenli ifade değişmezleri dışında boşluk karakterleri olarak ele alınır (bkz. 12.2).

12.2 Boşluk

Boşluk kod noktaları, kaynak metin okunabilirliğini artırmak ve belirteçleri (bölünemez sözcüksel birimler) birbirinden ayırmak için kullanılır, ancak bunun dışında önemsizdir. Boşluk kod noktaları, herhangi iki belirteç arasında ve girdinin başında veya sonunda bulunabilir. Boşluk kod noktaları, bir değişmez değerin bir parçasını oluşturan önemli kod noktaları olarak kabul edildikleri bir StringLiteral, bir RegularExpressionLiteral, bir Template veya bir TemplateSubstitutionTail içinde bulunabilir. Ayrıca bir Comment içinde de bulunabilirler, ancak başka hiçbir belirteç türü içinde görünemezler.

ECMAScript boşluk kod noktaları Tablo 30'da listelenmiştir.

Tablo 30: Boşluk Kod Noktaları

Kod Noktaları Adı Kısaltma
U+0009 CHARACTER TABULATION
U+000B LINE TABULATION
U+000C FORM FEED (FF)
U+FEFF ZERO WIDTH NO-BREAK SPACE
"Space_Separator" genel kategorisindeki herhangi bir kod noktası

Sözdizimi

WhiteSpace WhiteSpace ::

12.3 Satır Sonlandırıcılar

Boşluk kod noktaları gibi, satır sonlandırıcı kod noktaları da kaynak metin okunabilirliğini artırmak ve belirteçleri (bölünemez sözcüksel birimler) birbirinden ayırmak için kullanılır. Ancak, boşluk kod noktalarının aksine, satır sonlandırıcıların sözdizimsel dilbilgisinin davranışı üzerinde bir miktar etkisi vardır. Genel olarak, satır sonlandırıcılar herhangi iki belirteç arasında bulunabilir, ancak sözdizimsel dilbilgisi tarafından yasaklandıkları birkaç yer vardır. Satır sonlandırıcılar ayrıca otomatik noktalı virgül ekleme sürecini de etkiler (12.10). Bir satır sonlandırıcı, bir StringLiteral, Template veya TemplateSubstitutionTail dışında hiçbir belirteç içinde bulunamaz. ve satır sonlandırıcıları, bir LineContinuation'ın parçası olmadıkça bir StringLiteral belirteci içinde bulunamaz.

Bir satır sonlandırıcı, bir MultiLineComment içinde bulunabilir, ancak bir SingleLineComment içinde bulunamaz.

Satır sonlandırıcılar, düzenli ifadelerde \s sınıfı tarafından eşleşen boşluk kod noktaları kümesine dahildir.

ECMAScript satır sonlandırıcı kod noktaları Tablo 31'da listelenmiştir.

Tablo 31: Satır Sonlandırıcı Kod Noktaları

Kod Noktası Unicode Adı Kısaltma
U+000A LINE FEED (LF)
U+000D CARRIAGE RETURN (CR)
U+2028 LINE SEPARATOR
U+2029 PARAGRAPH SEPARATOR

Yalnızca Tablo 31'deki Unicode kod noktaları satır sonlandırıcı olarak ele alınır. Diğer yeni satır veya satır kırma Unicode kod noktaları satır sonlandırıcı olarak ele alınmaz, ancak Tablo 30'da listelenen gereklilikleri karşılıyorlarsa boşluk olarak ele alınır. dizisi yaygın olarak bir satır sonlandırıcı olarak kullanılır. Satır numaralarını raporlama amacıyla tek bir SourceCharacter olarak kabul edilmelidir.

Sözdizimi

LineTerminator LineTerminator ::

LineTerminatorSequence LineTerminatorSequence :: [lookahead ≠ ]

12.4 Yorumlar

Yorumlar tek satırlı veya çok satırlı olabilir. Çok satırlı yorumlar iç içe olamaz.

Tek satırlık bir yorum, bir LineTerminator kod noktası dışında herhangi bir Unicode kod noktası içerebileceğinden ve bir belirtecin her zaman mümkün olduğunca uzun olduğuna dair genel kural nedeniyle, tek satırlık bir yorum her zaman // işaretleyicisinden satırın sonuna kadar olan tüm kod noktalarından oluşur. Ancak, satırın sonundaki LineTerminator, tek satırlık yorumun bir parçası olarak kabul edilmez; sözcüksel dilbilgisi tarafından ayrı olarak tanınır ve sözdizimsel dilbilgisi için girdi öğeleri akışının bir parçası olur. Bu nokta çok önemlidir, çünkü tek satırlık yorumların varlığının veya yokluğunun otomatik noktalı virgül ekleme sürecini etkilemediğini ima eder (bkz. 12.10).

Yorumlar, boşluk gibi davranır ve atılır; ancak, bir MultiLineComment bir satır sonlandırıcı kod noktası içeriyorsa, sözdizimsel dilbilgisi tarafından ayrıştırma amacıyla tüm yorum bir LineTerminator olarak kabul edilir.

Sözdizimi

Comment Comment :: MultiLineComment SingleLineComment

MultiLineComment MultiLineComment :: /* MultiLineCommentCharsopt ***/**

MultiLineCommentChars MultiLineCommentChars :: MultiLineNotAsteriskChar MultiLineCommentCharsopt ***** PostAsteriskCommentCharsopt

PostAsteriskCommentChars PostAsteriskCommentChars :: MultiLineNotForwardSlashOrAsteriskChar MultiLineCommentCharsopt ***** PostAsteriskCommentCharsopt

MultiLineNotAsteriskChar MultiLineNotAsteriskChar :: SourceCharacter but not *****

MultiLineNotForwardSlashOrAsteriskChar MultiLineNotForwardSlashOrAsteriskChar :: SourceCharacter but not one of / or *****

SingleLineComment SingleLineComment :: // SingleLineCommentCharsopt

SingleLineCommentChars SingleLineCommentChars :: SingleLineCommentChar SingleLineCommentCharsopt

SingleLineCommentChar SingleLineCommentChar :: SourceCharacter but not LineTerminator

Bu bölümdeki bir dizi üretim, B.1.1 bölümünde alternatif tanımlarla verilmiştir.

12.5 Hashbang Yorumları

Hashbang Yorumları konuma duyarlıdır ve diğer yorum türleri gibi sözdizimsel dilbilgisi için girdi öğeleri akışından atılır.

Sözdizimi

HashbangComment HashbangComment :: #! SingleLineCommentCharsopt

12.6 Belirteçler

Sözdizimi

CommonToken CommonToken :: IdentifierName PrivateIdentifier Punctuator NumericLiteral StringLiteral Template

12.7 Adlar ve Anahtar Sözcükler

IdentifierName ve ReservedWord, Unicode Standart Eki #31, Identifier and Pattern Syntax'da verilen Varsayılan Tanımlayıcı Sözdizimi'ne göre, bazı küçük değişikliklerle yorumlanan belirteçlerdir. ReservedWord, IdentifierName'in numaralandırılmış bir alt kümesidir. Sözdizimsel dilbilgisi, Identifier'ı bir ReservedWord olmayan bir IdentifierName olarak tanımlar. Unicode tanımlayıcı dilbilgisi, Unicode Standardı tarafından belirtilen karakter özelliklerine dayanır. Unicode Standardı'nın en son sürümünde belirtilen kategorilerdeki Unicode kod noktaları, tüm uygun ECMAScript gerçekleştirimleri tarafından bu kategorilerdeymiş gibi ele alınmalıdır. ECMAScript gerçekleştirimleri, Unicode Standardı'nın daha sonraki sürümlerinde tanımlanan tanımlayıcı kod noktalarını tanıyabilir.

Sözdizimi

PrivateIdentifier PrivateIdentifier :: # IdentifierName

IdentifierName IdentifierName :: IdentifierStart IdentifierName IdentifierPart

IdentifierStart IdentifierStart :: IdentifierStartChar **** UnicodeEscapeSequence

IdentifierPart IdentifierPart :: IdentifierPartChar **** UnicodeEscapeSequence

IdentifierStartChar IdentifierStartChar :: UnicodeIDStart $ _

IdentifierPartChar IdentifierPartChar :: UnicodeIDContinue $

AsciiLetter AsciiLetter :: one of a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

UnicodeIDStart UnicodeIDStart :: "ID_Start" Unicode özelliğine sahip herhangi bir Unicode kod noktası

UnicodeIDContinue UnicodeIDContinue :: "ID_Continue" Unicode özelliğine sahip herhangi bir Unicode kod noktası

Uçolmayan UnicodeEscapeSequence'in tanımları 12.9.4'te verilmiştir.

12.7.1 Tanımlayıcı Adları

Bir IdentifierName içinde Unicode kaçış dizilerine izin verilir; burada UnicodeEscapeSequence'in IdentifierCodePoint değerine eşit tek bir Unicode kod noktasına katkıda bulunurlar. UnicodeEscapeSequence'den önce gelen \ herhangi bir kod noktasına katkıda bulunmaz. Bir *UnicodeEscapeSequence*, aksi takdirde geçersiz olacak bir *IdentifierName*'e bir kod noktası katkıda bulunmak için kullanılamaz. Başka bir deyişle, bir \ UnicodeEscapeSequence dizisi, katkıda bulunduğu SourceCharacter ile değiştirilseydi, sonuç yine de orijinal IdentifierName ile tam olarak aynı SourceCharacter öğeleri dizisine sahip geçerli bir IdentifierName olmalıdır. Bu belirtim içindeki tüm IdentifierName yorumları, herhangi bir belirli kod noktasına katkıda bulunmak için bir kaçış dizisi kullanılıp kullanılmadığına bakılmaksızın, gerçek kod noktalarına dayanır.

Unicode Standardı'na göre kanonik olarak eşdeğer olan iki IdentifierName, her UnicodeEscapeSequence değiştirildikten sonra tam olarak aynı kod noktası dizisi ile temsil edilmedikçe eşit değildir.

12.7.1.1 Statik Anlambilim: Erken Hatalar

IdentifierStart IdentifierStart :: **** UnicodeEscapeSequence

IdentifierPart IdentifierPart :: **** UnicodeEscapeSequence

12.7.1.2 Statik Anlambilim: IdentifierCodePoints

Sözdizimi yönelimli işlem IdentifierCodePoints hiçbir argüman almaz ve bir kod noktaları Listesi döndürür. Aşağıdaki üretimler üzerinde parça parça tanımlanmıştır:

IdentifierName IdentifierName :: IdentifierStart

  1. codePoint, IdentifierStart'in IdentifierCodePoint değeri olsun.

  2. « codePoint » döndür.

IdentifierName IdentifierName :: IdentifierName IdentifierPart

  1. cps, türetilen IdentifierName'in IdentifierCodePoints değeri olsun.

  2. codePoint, IdentifierPart'ın IdentifierCodePoint değeri olsun.

  3. cps ile « codePoint »'in liste birleştirmesini döndür.

12.7.1.3 Statik Anlambilim: IdentifierCodePoint

Sözdizimi yönelimli işlem IdentifierCodePoint hiçbir argüman almaz ve bir kod noktası döndürür. Aşağıdaki üretimler üzerinde parça parça tanımlanmıştır:

IdentifierStart IdentifierStart :: IdentifierStartChar

  1. IdentifierStartChar tarafından eşleşen kod noktasını döndür.

IdentifierPart IdentifierPart :: IdentifierPartChar

  1. IdentifierPartChar tarafından eşleşen kod noktasını döndür.

UnicodeEscapeSequence UnicodeEscapeSequence :: u Hex4Digits

  1. Sayısal değeri Hex4Digits'in MV'si olan kod noktasını döndür.

UnicodeEscapeSequence UnicodeEscapeSequence :: u{ CodePoint }

  1. Sayısal değeri CodePoint'ın MV'si olan kod noktasını döndür.

12.7.2 Anahtar Sözcükler ve Ayrılmış Sözcükler

Bir anahtar sözcük, IdentifierName ile eşleşen, ancak aynı zamanda sözdizimsel bir kullanıma sahip olan bir belirteçtir; yani, bazı sözdizimsel üretimlerde sabit genişlikli yazı tipinde, harfi harfine görünür. ECMAScript'in anahtar sözcükleri arasında if, while, async, await ve daha birçokları bulunur.

Ayrılmış bir sözcük, bir tanımlayıcı olarak kullanılamayan bir IdentifierName'dir. Birçok anahtar sözcük ayrılmış sözcüktür, ancak bazıları değildir ve bazıları yalnızca belirli bağlamlarda ayrılmıştır. if ve while ayrılmış sözcüklerdir. await, yalnızca async işlevler ve modüller içinde ayrılmıştır. async ayrılmış değildir; kısıtlama olmaksızın bir değişken adı veya deyim etiketi olarak kullanılabilir.

Bu belirtim, hangi adların geçerli tanımlayıcılar ve hangilerinin ayrılmış sözcükler olduğunu belirtmek için dilbilgisel üretimler ve erken hata kurallarının bir birleşimini kullanır. Aşağıdaki ReservedWord listesindeki await ve yield dışındaki tüm belirteçler koşulsuz olarak ayrılmıştır. await ve yield için istisnalar, parametreli sözdizimsel üretimler kullanılarak 13.1'de belirtilmiştir. Son olarak, birkaç erken hata kuralı geçerli tanımlayıcı kümesini kısıtlar. Bkz. 13.1.1, 14.3.1.1, 14.7.5.1 ve 15.7.1. Özetle, beş tanımlayıcı adı kategorisi vardır:

  • Her zaman tanımlayıcı olarak izin verilenler ve anahtar sözcük olmayanlar, örneğin Math, window, toString ve _;

  • Tanımlayıcı olarak asla izin verilmeyenler, yani aşağıda listelenen await ve yield dışındaki ReservedWord'ler;

  • Bağlamsal olarak tanımlayıcı olarak izin verilenler, yani await ve yield;

  • Katı kip kodunda bağlamsal olarak tanımlayıcı olarak izin verilmeyenler: let, static, implements, interface, package, private, protected ve public;

  • Her zaman tanımlayıcı olarak izin verilen, ancak Identifier'a izin verilmeyen yerlerde belirli sözdizimsel üretimler içinde anahtar sözcük olarak da görünenler: as, async, from, get, meta, of, set ve target.

Koşullu anahtar sözcük veya bağlamsal anahtar sözcük terimi, bazen son üç kategoride yer alan ve bu nedenle bazı bağlamlarda tanımlayıcı, bazılarında ise anahtar sözcük olarak kullanılabilen anahtar sözcüklere atıfta bulunmak için kullanılır.

Sözdizimi

ReservedWord ReservedWord :: one of await break case catch class const continue debugger default delete do else enum export extends false finally for function if import in instanceof new null return super switch this throw true try typeof var void while with yield

12.8 Noktalama İşaretleri

Sözdizimi

Punctuator Punctuator :: OptionalChainingPunctuator OtherPunctuator

OptionalChainingPunctuator OptionalChainingPunctuator :: ?. [lookahead ∉ DecimalDigit]

OtherPunctuator OtherPunctuator :: one of { ( ) [ ] . ... ; , <** **> <=** **>= == != === !== + - ***** % ****** ++ -- <<** **>> >>> & | ^ ! ~ && || ?? ? : = += -= ***=** %= ****=** <<=** **>>= >>>= &= |= ^= &&= ||= ??= =>

DivPunctuator DivPunctuator :: / /=

RightBracePunctuator RightBracePunctuator :: }

12.9 Değişmezler

12.9.1 Null Değişmezleri

Sözdizimi

NullLiteral NullLiteral :: null

12.9.2 Boolean Değişmezleri

Sözdizimi

BooleanLiteral BooleanLiteral :: true false

12.9.3 Sayısal Değişmezler

Sözdizimi

NumericLiteralSeparator NumericLiteralSeparator :: _

NumericLiteral NumericLiteral :: DecimalLiteral DecimalBigIntegerLiteral NonDecimalIntegerLiteral[+Sep] NonDecimalIntegerLiteral[+Sep] BigIntLiteralSuffix LegacyOctalIntegerLiteral

DecimalBigIntegerLiteral DecimalBigIntegerLiteral :: 0 BigIntLiteralSuffix NonZeroDigit DecimalDigits[+Sep]opt BigIntLiteralSuffix NonZeroDigit NumericLiteralSeparator DecimalDigits[+Sep] BigIntLiteralSuffix

NonDecimalIntegerLiteral NonDecimalIntegerLiteral[Sep] :: BinaryIntegerLiteral[?Sep] OctalIntegerLiteral[?Sep] HexIntegerLiteral[?Sep]

BigIntLiteralSuffix BigIntLiteralSuffix :: n

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

DecimalIntegerLiteral DecimalIntegerLiteral :: 0 NonZeroDigit NonZeroDigit NumericLiteralSeparatoropt DecimalDigits[+Sep] NonOctalDecimalIntegerLiteral

DecimalDigits DecimalDigits[Sep] :: DecimalDigit DecimalDigits[?Sep] DecimalDigit [+Sep] DecimalDigits[+Sep] NumericLiteralSeparator DecimalDigit

DecimalDigit DecimalDigit :: one of 0 1 2 3 4 5 6 7 8 9

NonZeroDigit NonZeroDigit :: one of 1 2 3 4 5 6 7 8 9

ExponentPart ExponentPart[Sep] :: ExponentIndicator SignedInteger[?Sep]

ExponentIndicator ExponentIndicator :: one of e E

SignedInteger SignedInteger[Sep] :: DecimalDigits[?Sep] + DecimalDigits[?Sep] - DecimalDigits[?Sep]

BinaryIntegerLiteral BinaryIntegerLiteral[Sep] :: 0b BinaryDigits[?Sep] 0B BinaryDigits[?Sep]

BinaryDigits BinaryDigits[Sep] :: BinaryDigit BinaryDigits[?Sep] BinaryDigit [+Sep] BinaryDigits[+Sep] NumericLiteralSeparator BinaryDigit

BinaryDigit BinaryDigit :: one of 0 1

OctalIntegerLiteral OctalIntegerLiteral[Sep] :: 0o OctalDigits[?Sep] 0O OctalDigits[?Sep]

OctalDigits OctalDigits[Sep] :: OctalDigit OctalDigits[?Sep] OctalDigit [+Sep] OctalDigits[+Sep] NumericLiteralSeparator OctalDigit

LegacyOctalIntegerLiteral LegacyOctalIntegerLiteral :: 0 OctalDigit LegacyOctalIntegerLiteral OctalDigit

NonOctalDecimalIntegerLiteral NonOctalDecimalIntegerLiteral :: 0 NonOctalDigit LegacyOctalLikeDecimalIntegerLiteral NonOctalDigit NonOctalDecimalIntegerLiteral DecimalDigit

LegacyOctalLikeDecimalIntegerLiteral LegacyOctalLikeDecimalIntegerLiteral :: 0 OctalDigit LegacyOctalLikeDecimalIntegerLiteral OctalDigit

OctalDigit OctalDigit :: one of 0 1 2 3 4 5 6 7

NonOctalDigit NonOctalDigit :: one of 8 9

HexIntegerLiteral HexIntegerLiteral[Sep] :: 0x HexDigits[?Sep] 0X HexDigits[?Sep]

HexDigits HexDigits[Sep] :: HexDigit HexDigits[?Sep] HexDigit [+Sep] HexDigits[+Sep] NumericLiteralSeparator HexDigit

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

Bir NumericLiteral'dan hemen sonra gelen SourceCharacter, bir IdentifierStart veya DecimalDigit olmamalıdır.

12.9.3.1 Statik Anlambilim: Erken Hatalar

NumericLiteral NumericLiteral :: LegacyOctalIntegerLiteral

DecimalIntegerLiteral DecimalIntegerLiteral :: NonOctalDecimalIntegerLiteral

  • IsStrict(bu üretim) true ise, bu bir Sözdizimi Hatasıdır.

12.9.3.2 Statik Anlambilim: MV

Bir sayısal değişmez, Number türü veya BigInt türü bir değeri temsil eder.

-

DecimalLiteral DecimalLiteral :: DecimalIntegerLiteral . DecimalDigits

üretiminin MV'si, DecimalIntegerLiteral'ın MV'si artı (DecimalDigits'in MV'si × 10-n)'dir; burada n, tüm NumericLiteralSeparator geçişleri hariç, DecimalDigits'deki kod noktalarının sayısıdır.

-

DecimalLiteral DecimalLiteral :: DecimalIntegerLiteral . ExponentPart

üretiminin MV'si, DecimalIntegerLiteral'ın MV'si × 10e'dir; burada e, ExponentPart'ın MV'sidir.

-

DecimalLiteral DecimalLiteral :: DecimalIntegerLiteral . DecimalDigits ExponentPart

üretiminin MV'si, (DecimalIntegerLiteral'ın MV'si artı (DecimalDigits'in MV'si × 10-n)) × 10e'dir; burada n, tüm NumericLiteralSeparator geçişleri hariç, DecimalDigits'deki kod noktalarının sayısıdır ve e, ExponentPart'ın MV'sidir.

-

DecimalLiteral DecimalLiteral :: . DecimalDigits

üretiminin MV'si, DecimalDigits'in MV'si × 10-n'dir; burada n, tüm NumericLiteralSeparator geçişleri hariç, DecimalDigits'deki kod noktalarının sayısıdır.

-

DecimalLiteral DecimalLiteral :: . DecimalDigits ExponentPart

üretiminin MV'si, DecimalDigits'in MV'si × 10e - n'dir; burada n, tüm NumericLiteralSeparator geçişleri hariç, DecimalDigits'deki kod noktalarının sayısıdır ve e, ExponentPart'ın MV'sidir.

-

DecimalLiteral DecimalLiteral :: DecimalIntegerLiteral ExponentPart

üretiminin MV'si, DecimalIntegerLiteral'ın MV'si × 10e'dir; burada e, ExponentPart'ın MV'sidir.

-

DecimalIntegerLiteral DecimalIntegerLiteral :: 0

üretiminin MV'si 0'dır.

-

DecimalIntegerLiteral DecimalIntegerLiteral :: NonZeroDigit NumericLiteralSeparatoropt DecimalDigits

üretiminin MV'si, (NonZeroDigit'in MV'si × 10n) artı DecimalDigits'in MV'sidir; burada n, tüm NumericLiteralSeparator geçişleri hariç, DecimalDigits'deki kod noktalarının sayısıdır.

-

DecimalDigits DecimalDigits :: DecimalDigits DecimalDigit

üretiminin MV'si, (DecimalDigits'in MV'si × 10) artı DecimalDigit'in MV'sidir.

-

DecimalDigits DecimalDigits :: DecimalDigits NumericLiteralSeparator DecimalDigit

üretiminin MV'si, (DecimalDigits'in MV'si × 10) artı DecimalDigit'in MV'sidir.

-

ExponentPart ExponentPart :: ExponentIndicator SignedInteger

üretiminin MV'si, SignedInteger'in MV'sidir.

-

SignedInteger SignedInteger :: - DecimalDigits

üretiminin MV'si, DecimalDigits'in MV'sinin negatifidir.

-

DecimalDigit DecimalDigit :: 0

veya

HexDigit HexDigit :: 0

veya

OctalDigit OctalDigit :: 0

veya

LegacyOctalEscapeSequence LegacyOctalEscapeSequence :: 0

veya

BinaryDigit BinaryDigit :: 0

üretiminin MV'si 0'dır.

-

DecimalDigit DecimalDigit :: 1

veya

NonZeroDigit NonZeroDigit :: 1

veya

HexDigit HexDigit :: 1

veya

OctalDigit OctalDigit :: 1

veya

BinaryDigit BinaryDigit :: 1

üretiminin MV'si 1'dir.

-

DecimalDigit DecimalDigit :: 2

veya

NonZeroDigit NonZeroDigit :: 2

veya

HexDigit HexDigit :: 2

veya

OctalDigit OctalDigit :: 2

üretiminin MV'si 2'dir.

-

DecimalDigit DecimalDigit :: 3

veya

NonZeroDigit NonZeroDigit :: 3

veya

HexDigit HexDigit :: 3

veya

OctalDigit OctalDigit :: 3

üretiminin MV'si 3'tür.

-

DecimalDigit DecimalDigit :: 4

veya

NonZeroDigit NonZeroDigit :: 4

veya

HexDigit HexDigit :: 4

veya

OctalDigit OctalDigit :: 4

üretiminin MV'si 4'tür.

-

DecimalDigit DecimalDigit :: 5

veya

NonZeroDigit NonZeroDigit :: 5

veya

HexDigit HexDigit :: 5

veya

OctalDigit OctalDigit :: 5

üretiminin MV'si 5'tir.

-

DecimalDigit DecimalDigit :: 6

veya

NonZeroDigit NonZeroDigit :: 6

veya

HexDigit HexDigit :: 6

veya

OctalDigit OctalDigit :: 6

üretiminin MV'si 6'dır.

-

DecimalDigit DecimalDigit :: 7

veya

NonZeroDigit NonZeroDigit :: 7

veya

HexDigit HexDigit :: 7

veya

OctalDigit OctalDigit :: 7

üretiminin MV'si 7'dir.

-

DecimalDigit DecimalDigit :: 8

veya

NonZeroDigit NonZeroDigit :: 8

veya

NonOctalDigit NonOctalDigit :: 8

veya

HexDigit HexDigit :: 8

üretiminin MV'si 8'dir.

-

DecimalDigit DecimalDigit :: 9

veya

NonZeroDigit NonZeroDigit :: 9

veya

NonOctalDigit NonOctalDigit :: 9

veya

HexDigit HexDigit :: 9

üretiminin MV'si 9'dur.

-

HexDigit HexDigit :: a

veya

HexDigit HexDigit :: A

üretiminin MV'si 10'dur.

-

HexDigit HexDigit :: b

veya

HexDigit HexDigit :: B

üretiminin MV'si 11'dir.

-

HexDigit HexDigit :: c

veya

HexDigit HexDigit :: C

üretiminin MV'si 12'dir.

-

HexDigit HexDigit :: d

veya

HexDigit HexDigit :: D

üretiminin MV'si 13'tür.

-

HexDigit HexDigit :: e

veya

HexDigit HexDigit :: E

üretiminin MV'si 14'tür.

-

HexDigit HexDigit :: f

veya

HexDigit HexDigit :: F

üretiminin MV'si 15'tir.

-

BinaryDigits BinaryDigits :: BinaryDigits BinaryDigit

üretiminin MV'si, (BinaryDigits'in MV'si × 2) artı BinaryDigit'in MV'sidir.

-

BinaryDigits BinaryDigits :: BinaryDigits NumericLiteralSeparator BinaryDigit

üretiminin MV'si, (BinaryDigits'in MV'si × 2) artı BinaryDigit'in MV'sidir.

-

OctalDigits OctalDigits :: OctalDigits OctalDigit

üretiminin MV'si, (OctalDigits'in MV'si × 8) artı OctalDigit'in MV'sidir.

-

OctalDigits OctalDigits :: OctalDigits NumericLiteralSeparator OctalDigit

üretiminin MV'si, (OctalDigits'in MV'si × 8) artı OctalDigit'in MV'sidir.

-

LegacyOctalIntegerLiteral LegacyOctalIntegerLiteral :: LegacyOctalIntegerLiteral OctalDigit

üretiminin MV'si, (LegacyOctalIntegerLiteral'ın MV'si çarpı 8) artı OctalDigit'in MV'sidir.

-

NonOctalDecimalIntegerLiteral NonOctalDecimalIntegerLiteral :: LegacyOctalLikeDecimalIntegerLiteral NonOctalDigit

üretiminin MV'si, (LegacyOctalLikeDecimalIntegerLiteral'ın MV'si çarpı 10) artı NonOctalDigit'in MV'sidir.

-

NonOctalDecimalIntegerLiteral NonOctalDecimalIntegerLiteral :: NonOctalDecimalIntegerLiteral DecimalDigit

üretiminin MV'si, (NonOctalDecimalIntegerLiteral'ın MV'si çarpı 10) artı DecimalDigit'in MV'sidir.

-

LegacyOctalLikeDecimalIntegerLiteral LegacyOctalLikeDecimalIntegerLiteral :: LegacyOctalLikeDecimalIntegerLiteral OctalDigit

üretiminin MV'si, (LegacyOctalLikeDecimalIntegerLiteral'ın MV'si çarpı 10) artı OctalDigit'in MV'sidir.

-

HexDigits HexDigits :: HexDigits HexDigit

üretiminin MV'si, (HexDigits'in MV'si × 16) artı HexDigit'in MV'sidir.

-

HexDigits HexDigits :: HexDigits NumericLiteralSeparator HexDigit

üretiminin MV'si, (HexDigits'in MV'si × 16) artı HexDigit'in MV'sidir.

12.9.3.3 Statik Anlambilim: NumericValue

Sözdizimi yönelimli işlem NumericValue hiçbir argüman almaz ve bir Number veya bir BigInt döndürür. Aşağıdaki üretimler üzerinde parça parça tanımlanmıştır:

NumericLiteral NumericLiteral :: DecimalLiteral

  1. RoundMVResult(DecimalLiteral'ın MV'si) döndür.

NumericLiteral NumericLiteral :: NonDecimalIntegerLiteral

  1. 𝔽(NonDecimalIntegerLiteral'ın MV'si) döndür.

NumericLiteral NumericLiteral :: LegacyOctalIntegerLiteral

  1. 𝔽(LegacyOctalIntegerLiteral'ın MV'si) döndür.

NumericLiteral NumericLiteral :: NonDecimalIntegerLiteral BigIntLiteralSuffix

  1. NonDecimalIntegerLiteral'ın MV'si için BigInt value for döndür.

DecimalBigIntegerLiteral DecimalBigIntegerLiteral :: 0 BigIntLiteralSuffix

  1. 0 döndür.

DecimalBigIntegerLiteral DecimalBigIntegerLiteral :: NonZeroDigit BigIntLiteralSuffix

  1. NonZeroDigit'in MV'si için BigInt value for döndür.

DecimalBigIntegerLiteral DecimalBigIntegerLiteral :: NonZeroDigit DecimalDigits BigIntLiteralSuffix NonZeroDigit NumericLiteralSeparator DecimalDigits BigIntLiteralSuffix

  1. n, tüm NumericLiteralSeparator geçişleri hariç, DecimalDigits'deki kod noktalarının sayısı olsun.

  2. mv = (NonZeroDigit'in MV'si × 10n) artı DecimalDigits'in MV'si olsun.

  3. (mv) döndür.

12.9.4 Dizgi Değişmezleri

Sözdizimi

StringLiteral StringLiteral :: " DoubleStringCharactersopt " ' SingleStringCharactersopt '

DoubleStringCharacters DoubleStringCharacters :: DoubleStringCharacter DoubleStringCharactersopt

SingleStringCharacters SingleStringCharacters :: SingleStringCharacter SingleStringCharactersopt

DoubleStringCharacter DoubleStringCharacter :: SourceCharacter but not one of " or **** or LineTerminator **** EscapeSequence LineContinuation

SingleStringCharacter SingleStringCharacter :: SourceCharacter but not one of ' or **** or LineTerminator **** EscapeSequence LineContinuation

LineContinuation LineContinuation :: **** LineTerminatorSequence

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

CharacterEscapeSequence CharacterEscapeSequence :: SingleEscapeCharacter NonEscapeCharacter

SingleEscapeCharacter SingleEscapeCharacter :: one of ' " **** b f n r t v

NonEscapeCharacter NonEscapeCharacter :: SourceCharacter but not one of EscapeCharacter or LineTerminator

EscapeCharacter EscapeCharacter :: SingleEscapeCharacter DecimalDigit x u

LegacyOctalEscapeSequence LegacyOctalEscapeSequence :: 0 [lookahead ∈ { 8, 9 }] NonZeroOctalDigit [lookahead ∉ OctalDigit] ZeroToThree OctalDigit [lookahead ∉ OctalDigit] FourToSeven OctalDigit ZeroToThree OctalDigit OctalDigit

NonZeroOctalDigit NonZeroOctalDigit :: OctalDigit but not 0

ZeroToThree ZeroToThree :: one of 0 1 2 3

FourToSeven FourToSeven :: one of 4 5 6 7

NonOctalDecimalEscapeSequence NonOctalDecimalEscapeSequence :: one of 8 9

HexEscapeSequence HexEscapeSequence :: x HexDigit HexDigit

UnicodeEscapeSequence UnicodeEscapeSequence :: u Hex4Digits u{ CodePoint }

Hex4Digits Hex4Digits :: HexDigit HexDigit HexDigit HexDigit

Uçolmayan HexDigit'in tanımı 12.9.3'te verilmiştir. SourceCharacter, 11.1'de tanımlanmıştır.

12.9.4.1 Statik Anlambilim: Erken Hatalar

EscapeSequence EscapeSequence :: LegacyOctalEscapeSequence NonOctalDecimalEscapeSequence

  • IsStrict(bu üretim) true ise, bu bir Sözdizimi Hatasıdır.

12.9.4.2 Statik Anlambilim: SV

Sözdizimi yönelimli işlem SV hiçbir argüman almaz ve bir String döndürür.

Bir dizgi değişmezi, String türü bir değeri temsil eder. SV, dizgi değişmezinin çeşitli bölümlerine özyineli uygulama yoluyla dizgi değişmezleri için String değerleri üretir. Bu sürecin bir parçası olarak, dizgi değişmezi içindeki bazı Unicode kod noktaları, aşağıda veya 12.9.3'te açıklandığı gibi bir matematiksel değere sahip olarak yorumlanır.

-

StringLiteral StringLiteral :: " "

üretiminin SV'si boş String'dir.

-

StringLiteral StringLiteral :: ' '

üretiminin SV'si boş String'dir.

-

DoubleStringCharacters DoubleStringCharacters :: DoubleStringCharacter DoubleStringCharacters

üretiminin SV'si, DoubleStringCharacter'ın SV'si ile DoubleStringCharacters'in SV'sinin dizgi birleştirmesidir.

-

SingleStringCharacters SingleStringCharacters :: SingleStringCharacter SingleStringCharacters

üretiminin SV'si, SingleStringCharacter'ın SV'si ile SingleStringCharacters'in SV'sinin dizgi birleştirmesidir.

-

DoubleStringCharacter DoubleStringCharacter :: SourceCharacter but not one of " or **** or LineTerminator

üretiminin SV'si, SourceCharacter tarafından eşleşen kod noktası üzerinde UTF16EncodeCodePoint gerçekleştirmenin sonucudur.

-

DoubleStringCharacter DoubleStringCharacter ::

üretiminin SV'si, 0x2028 (LINE SEPARATOR) kod biriminden oluşan String değeridir.

-

DoubleStringCharacter DoubleStringCharacter ::

üretiminin SV'si, 0x2029 (PARAGRAPH SEPARATOR) kod biriminden oluşan String değeridir.

-

DoubleStringCharacter DoubleStringCharacter :: LineContinuation

üretiminin SV'si boş String'dir.

-

SingleStringCharacter SingleStringCharacter :: SourceCharacter but not one of ' or **** or LineTerminator

üretiminin SV'si, SourceCharacter tarafından eşleşen kod noktası üzerinde UTF16EncodeCodePoint gerçekleştirmenin sonucudur.

-

SingleStringCharacter SingleStringCharacter ::

üretiminin SV'si, 0x2028 (LINE SEPARATOR) kod biriminden oluşan String değeridir.

-

SingleStringCharacter SingleStringCharacter ::

üretiminin SV'si, 0x2029 (PARAGRAPH SEPARATOR) kod biriminden oluşan String değeridir.

-

SingleStringCharacter SingleStringCharacter :: LineContinuation

üretiminin SV'si boş String'dir.

-

EscapeSequence EscapeSequence :: 0

üretiminin SV'si, 0x0000 (NULL) kod biriminden oluşan String değeridir.

-

CharacterEscapeSequence CharacterEscapeSequence :: SingleEscapeCharacter

üretiminin SV'si, sayısal değeri Tablo 32'ye göre SingleEscapeCharacter tarafından belirlenen kod biriminden oluşan String değeridir.

Tablo 32: Dizgi Tek Karakter Kaçış Dizileri

Kaçış Dizisi Kod Birimi Değeri Unicode Karakter Adı Sembol
\b 0x0008 BACKSPACE
\t 0x0009 CHARACTER TABULATION
\n 0x000A LINE FEED (LF)
\v 0x000B LINE TABULATION
\f 0x000C FORM FEED (FF)
\r 0x000D CARRIAGE RETURN (CR)
\" 0x0022 QUOTATION MARK "
\' 0x0027 APOSTROPHE '
\\ 0x005C REVERSE SOLIDUS \

-

NonEscapeCharacter NonEscapeCharacter :: SourceCharacter but not one of EscapeCharacter or LineTerminator

üretiminin SV'si, SourceCharacter tarafından eşleşen kod noktası üzerinde UTF16EncodeCodePoint gerçekleştirmenin sonucudur.

-

EscapeSequence EscapeSequence :: LegacyOctalEscapeSequence

üretiminin SV'si, sayısal değeri LegacyOctalEscapeSequence'in MV'si olan kod biriminden oluşan String değeridir.

-

NonOctalDecimalEscapeSequence NonOctalDecimalEscapeSequence :: 8

üretiminin SV'si, 0x0038 (DIGIT EIGHT) kod biriminden oluşan String değeridir.

-

NonOctalDecimalEscapeSequence NonOctalDecimalEscapeSequence :: 9

üretiminin SV'si, 0x0039 (DIGIT NINE) kod biriminden oluşan String değeridir.

-

HexEscapeSequence HexEscapeSequence :: x HexDigit HexDigit

üretiminin SV'si, sayısal değeri HexEscapeSequence'in MV'si olan kod biriminden oluşan String değeridir.

-

Hex4Digits Hex4Digits :: HexDigit HexDigit HexDigit HexDigit

üretiminin SV'si, sayısal değeri Hex4Digits'in MV'si olan kod biriminden oluşan String değeridir.

-

UnicodeEscapeSequence UnicodeEscapeSequence :: u{ CodePoint }

üretiminin SV'si, CodePoint'ın MV'si üzerinde UTF16EncodeCodePoint gerçekleştirmenin sonucudur.

-

TemplateEscapeSequence TemplateEscapeSequence :: 0

üretiminin SV'si, 0x0000 (NULL) kod biriminden oluşan String değeridir.

12.9.4.3 Statik Anlambilim: MV

-

LegacyOctalEscapeSequence LegacyOctalEscapeSequence :: ZeroToThree OctalDigit

üretiminin MV'si, (8 çarpı ZeroToThree'ün MV'si) artı OctalDigit'in MV'sidir.

-

LegacyOctalEscapeSequence LegacyOctalEscapeSequence :: FourToSeven OctalDigit

üretiminin MV'si, (8 çarpı FourToSeven'in MV'si) artı OctalDigit'in MV'sidir.

-

LegacyOctalEscapeSequence LegacyOctalEscapeSequence :: ZeroToThree OctalDigit OctalDigit

üretiminin MV'si, (64 (yani, 82) çarpı ZeroToThree'ün MV'si) artı (8 çarpı birinci OctalDigit'in MV'si) artı ikinci OctalDigit'in MV'sidir.

-

ZeroToThree ZeroToThree :: 0

üretiminin MV'si 0'dır.

-

ZeroToThree ZeroToThree :: 1

üretiminin MV'si 1'dir.

-

ZeroToThree ZeroToThree :: 2

üretiminin MV'si 2'dir.

-

ZeroToThree ZeroToThree :: 3

üretiminin MV'si 3'tür.

-

FourToSeven FourToSeven :: 4

üretiminin MV'si 4'tür.

-

FourToSeven FourToSeven :: 5

üretiminin MV'si 5'tir.

-

FourToSeven FourToSeven :: 6

üretiminin MV'si 6'dır.

-

FourToSeven FourToSeven :: 7

üretiminin MV'si 7'dir.

-

HexEscapeSequence HexEscapeSequence :: x HexDigit HexDigit

üretiminin MV'si, (16 çarpı birinci HexDigit'in MV'si) artı ikinci HexDigit'in MV'sidir.

-

Hex4Digits Hex4Digits :: HexDigit HexDigit HexDigit HexDigit

üretiminin MV'si, (0x1000 × birinci HexDigit'in MV'si) artı (0x100 × ikinci HexDigit'in MV'si) artı (0x10 × üçüncü HexDigit'in MV'si) artı dördüncü HexDigit'in MV'sidir.

12.9.5 Düzenli İfade Değişmezleri

Aşağıdaki üretimler, bir düzenli ifade değişmezinin sözdizimini tanımlar ve düzenli ifade değişmezinin sonunu bulmak için girdi öğesi tarayıcısı tarafından kullanılır. RegularExpressionBody ve RegularExpressionFlags'i oluşturan kaynak metin, daha sonra daha katı ECMAScript Düzenli İfade dilbilgisi (22.2.1) kullanılarak yeniden ayrıştırılır.

Bir gerçekleştirim, 22.2.1'de tanımlanan ECMAScript Düzenli İfade dilbilgisini genişletebilir, ancak aşağıda tanımlanan RegularExpressionBody ve RegularExpressionFlags üretimlerini veya bu üretimler tarafından kullanılan üretimleri genişletmemelidir.

Sözdizimi

RegularExpressionLiteral RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags

RegularExpressionBody RegularExpressionBody :: RegularExpressionFirstChar RegularExpressionChars

RegularExpressionChars RegularExpressionChars :: [empty] RegularExpressionChars RegularExpressionChar

RegularExpressionFirstChar RegularExpressionFirstChar :: RegularExpressionNonTerminator but not one of ***** or **** or / or [ RegularExpressionBackslashSequence RegularExpressionClass

RegularExpressionChar RegularExpressionChar :: RegularExpressionNonTerminator but not one of **** or / or [ RegularExpressionBackslashSequence RegularExpressionClass

RegularExpressionBackslashSequence RegularExpressionBackslashSequence :: **** RegularExpressionNonTerminator

RegularExpressionNonTerminator RegularExpressionNonTerminator :: SourceCharacter but not LineTerminator

RegularExpressionClass RegularExpressionClass :: [ RegularExpressionClassChars ]

RegularExpressionClassChars RegularExpressionClassChars :: [empty] RegularExpressionClassChars RegularExpressionClassChar

RegularExpressionClassChar RegularExpressionClassChar :: RegularExpressionNonTerminator but not one of ] or **** RegularExpressionBackslashSequence

RegularExpressionFlags RegularExpressionFlags :: [empty] RegularExpressionFlags IdentifierPartChar

12.9.5.1 Statik Anlambilim: BodyText

Sözdizimi yönelimli işlem BodyText hiçbir argüman almaz ve kaynak metin döndürür. Aşağıdaki üretimler üzerinde parça parça tanımlanmıştır:

RegularExpressionLiteral RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags

  1. RegularExpressionBody olarak tanınan kaynak metni döndür.

12.9.5.2 Statik Anlambilim: FlagText

Sözdizimi yönelimli işlem FlagText hiçbir argüman almaz ve kaynak metin döndürür. Aşağıdaki üretimler üzerinde parça parça tanımlanmıştır:

RegularExpressionLiteral RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags

  1. RegularExpressionFlags olarak tanınan kaynak metni döndür.

12.9.6 Şablon Değişmezi Sözcüksel Bileşenleri

Sözdizimi

Template Template :: NoSubstitutionTemplate TemplateHead

NoSubstitutionTemplate NoSubstitutionTemplate :: ** *[TemplateCharacters](#prod-TemplateCharacters)opt* **

TemplateHead TemplateHead :: ` TemplateCharactersopt ${

TemplateSubstitutionTail TemplateSubstitutionTail :: TemplateMiddle TemplateTail

TemplateMiddle TemplateMiddle :: } TemplateCharactersopt ${

TemplateTail TemplateTail :: } TemplateCharactersopt `

TemplateCharacters TemplateCharacters :: TemplateCharacter TemplateCharactersopt

TemplateCharacter TemplateCharacter :: $ [lookahead ≠ {] **** TemplateEscapeSequence **** NotEscapeSequence LineContinuation LineTerminatorSequence SourceCharacter but not one of ` or **** or $ or LineTerminator

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

NotEscapeSequence NotEscapeSequence :: 0 DecimalDigit DecimalDigit but not 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 NotCodePoint :: HexDigits[~Sep] but only if the MV of HexDigits > 0x10FFFF

CodePoint CodePoint :: HexDigits[~Sep] but only if the MV of HexDigits ≤ 0x10FFFF

12.9.6.1 Statik Anlambilim: TV

Sözdizimi yönelimli işlem TV hiçbir argüman almaz ve bir String veya undefined döndürür. Bir şablon değişmezi bileşeni, TV tarafından String türü bir değer olarak yorumlanır. TV, bir şablon nesnesinin indisli bileşenlerini (halk dilinde, şablon değerleri) oluşturmak için kullanılır. TV'de, kaçış dizileri, kaçış dizisi tarafından temsil edilen Unicode kod noktasının UTF-16 kod birim(ler)i ile değiştirilir.

-

NoSubstitutionTemplate NoSubstitutionTemplate :: ** **

üretiminin TV'si boş String'dir.

-

TemplateHead TemplateHead :: ` ${

üretiminin TV'si boş String'dir.

-

TemplateMiddle TemplateMiddle :: } ${

üretiminin TV'si boş String'dir.

-

TemplateTail TemplateTail :: } `

üretiminin TV'si boş String'dir.

-

TemplateCharacters TemplateCharacters :: TemplateCharacter TemplateCharacters

üretiminin TV'si, TemplateCharacter'ın TV'si undefined ise veya TemplateCharacters'in TV'si undefined ise undefined'dır. Aksi takdirde, TemplateCharacter'ın TV'si ile TemplateCharacters'in TV'sinin dizgi birleştirmesidir.

-

TemplateCharacter TemplateCharacter :: SourceCharacter but not one of ` or **** or $ or LineTerminator

üretiminin TV'si, SourceCharacter tarafından eşleşen kod noktası üzerinde UTF16EncodeCodePoint gerçekleştirmenin sonucudur.

-

TemplateCharacter TemplateCharacter :: $

üretiminin TV'si, 0x0024 (DOLLAR SIGN) kod biriminden oluşan String değeridir.

-

TemplateCharacter TemplateCharacter :: **** TemplateEscapeSequence

üretiminin TV'si, TemplateEscapeSequence'in SV'sidir.

-

TemplateCharacter TemplateCharacter :: **** NotEscapeSequence

üretiminin TV'si undefined'dır.

-

TemplateCharacter TemplateCharacter :: LineTerminatorSequence

üretiminin TV'si, LineTerminatorSequence'in TRV'sidir.

-

LineContinuation LineContinuation :: **** LineTerminatorSequence

üretiminin TV'si boş String'dir.

12.9.6.2 Statik Anlambilim: TRV

Sözdizimi yönelimli işlem TRV hiçbir argüman almaz ve bir String döndürür. Bir şablon değişmezi bileşeni, TRV tarafından String türü bir değer olarak yorumlanır. TRV, bir şablon nesnesinin ham bileşenlerini (halk dilinde, şablon ham değerleri) oluşturmak için kullanılır. TRV, TV'ye benzer, farkı TRV'de kaçış dizilerinin değişmezde göründükleri gibi yorumlanmasıdır.

-

NoSubstitutionTemplate NoSubstitutionTemplate :: ** **

üretiminin TRV'si boş String'dir.

-

TemplateHead TemplateHead :: ` ${

üretiminin TRV'si boş String'dir.

-

TemplateMiddle TemplateMiddle :: } ${

üretiminin TRV'si boş String'dir.

-

TemplateTail TemplateTail :: } `

üretiminin TRV'si boş String'dir.

-

TemplateCharacters TemplateCharacters :: TemplateCharacter TemplateCharacters

üretiminin TRV'si, TemplateCharacter'ın TRV'si ile TemplateCharacters'in TRV'sinin dizgi birleştirmesidir.

-

TemplateCharacter TemplateCharacter :: SourceCharacter but not one of ` or **** or $ or LineTerminator

üretiminin TRV'si, SourceCharacter tarafından eşleşen kod noktası üzerinde UTF16EncodeCodePoint gerçekleştirmenin sonucudur.

-

TemplateCharacter TemplateCharacter :: $

üretiminin TRV'si, 0x0024 (DOLLAR SIGN) kod biriminden oluşan String değeridir.

-

TemplateCharacter TemplateCharacter :: **** TemplateEscapeSequence

üretiminin TRV'si, 0x005C (REVERSE SOLIDUS) kod birimi ile TemplateEscapeSequence'in TRV'sinin dizgi birleştirmesidir.

-

TemplateCharacter TemplateCharacter :: **** NotEscapeSequence

üretiminin TRV'si, 0x005C (REVERSE SOLIDUS) kod birimi ile NotEscapeSequence'in TRV'sinin dizgi birleştirmesidir.

-

TemplateEscapeSequence TemplateEscapeSequence :: 0

üretiminin TRV'si, 0x0030 (DIGIT ZERO) kod biriminden oluşan String değeridir.

-

NotEscapeSequence NotEscapeSequence :: 0 DecimalDigit

üretiminin TRV'si, 0x0030 (DIGIT ZERO) kod birimi ile DecimalDigit'in TRV'sinin dizgi birleştirmesidir.

-

NotEscapeSequence NotEscapeSequence :: x [lookahead ∉ HexDigit]

üretiminin TRV'si, 0x0078 (LATIN SMALL LETTER X) kod biriminden oluşan String değeridir.

-

NotEscapeSequence NotEscapeSequence :: x HexDigit [lookahead ∉ HexDigit]

üretiminin TRV'si, 0x0078 (LATIN SMALL LETTER X) kod birimi ile HexDigit'in TRV'sinin dizgi birleştirmesidir.

-

NotEscapeSequence NotEscapeSequence :: u [lookahead ∉ HexDigit] [lookahead ≠ {]

üretiminin TRV'si, 0x0075 (LATIN SMALL LETTER U) kod biriminden oluşan String değeridir.

-

NotEscapeSequence NotEscapeSequence :: u HexDigit [lookahead ∉ HexDigit]

üretiminin TRV'si, 0x0075 (LATIN SMALL LETTER U) kod birimi ile HexDigit'in TRV'sinin dizgi birleştirmesidir.

-

NotEscapeSequence NotEscapeSequence :: u HexDigit HexDigit [lookahead ∉ HexDigit]

üretiminin TRV'si, 0x0075 (LATIN SMALL LETTER U) kod birimi, birinci HexDigit'in TRV'si ve ikinci HexDigit'in TRV'sinin dizgi birleştirmesidir.

-

NotEscapeSequence NotEscapeSequence :: u HexDigit HexDigit HexDigit [lookahead ∉ HexDigit]

üretiminin TRV'si, 0x0075 (LATIN SMALL LETTER U) kod birimi, birinci HexDigit'in TRV'si, ikinci HexDigit'in TRV'si ve üçüncü HexDigit'in TRV'sinin dizgi birleştirmesidir.

-

NotEscapeSequence NotEscapeSequence :: u { [lookahead ∉ HexDigit]

üretiminin TRV'si, 0x0075 (LATIN SMALL LETTER U) kod birimi ile 0x007B (LEFT CURLY BRACKET) kod biriminin dizgi birleştirmesidir.

-

NotEscapeSequence NotEscapeSequence :: u { NotCodePoint [lookahead ∉ HexDigit]

üretiminin TRV'si, 0x0075 (LATIN SMALL LETTER U) kod birimi, 0x007B (LEFT CURLY BRACKET) kod birimi ve NotCodePoint'ın TRV'sinin dizgi birleştirmesidir.

-

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

üretiminin TRV'si, 0x0075 (LATIN SMALL LETTER U) kod birimi, 0x007B (LEFT CURLY BRACKET) kod birimi ve CodePoint'ın TRV'sinin dizgi birleştirmesidir.

-

DecimalDigit DecimalDigit :: one of 0 1 2 3 4 5 6 7 8 9

üretiminin TRV'si, bu üretim tarafından eşleşen tek kod noktası üzerinde UTF16EncodeCodePoint gerçekleştirmenin sonucudur.

-

CharacterEscapeSequence CharacterEscapeSequence :: NonEscapeCharacter

üretiminin TRV'si, NonEscapeCharacter'ın SV'sidir.

-

SingleEscapeCharacter SingleEscapeCharacter :: one of ' " **** b f n r t v

üretiminin TRV'si, bu üretim tarafından eşleşen tek kod noktası üzerinde UTF16EncodeCodePoint gerçekleştirmenin sonucudur.

-

HexEscapeSequence HexEscapeSequence :: x HexDigit HexDigit

üretiminin TRV'si, 0x0078 (LATIN SMALL LETTER X) kod birimi, birinci HexDigit'in TRV'si ve ikinci HexDigit'in TRV'sinin dizgi birleştirmesidir.

-

UnicodeEscapeSequence UnicodeEscapeSequence :: u Hex4Digits

üretiminin TRV'si, 0x0075 (LATIN SMALL LETTER U) kod birimi ile Hex4Digits'in TRV'sinin dizgi birleştirmesidir.

-

UnicodeEscapeSequence UnicodeEscapeSequence :: u{ CodePoint }

üretiminin TRV'si, 0x0075 (LATIN SMALL LETTER U) kod birimi, 0x007B (LEFT CURLY BRACKET) kod birimi, CodePoint'ın TRV'si ve 0x007D (RIGHT CURLY BRACKET) kod biriminin dizgi birleştirmesidir.

-

Hex4Digits Hex4Digits :: HexDigit HexDigit HexDigit HexDigit

üretiminin TRV'si, birinci HexDigit'in TRV'si, ikinci HexDigit'in TRV'si, üçüncü HexDigit'in TRV'si ve dördüncü HexDigit'in TRV'sinin dizgi birleştirmesidir.

-

HexDigits HexDigits :: HexDigits HexDigit

üretiminin TRV'si, HexDigits'in TRV'si ile HexDigit'in TRV'sinin dizgi birleştirmesidir.

-

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

üretiminin TRV'si, bu üretim tarafından eşleşen tek kod noktası üzerinde UTF16EncodeCodePoint gerçekleştirmenin sonucudur.

-

LineContinuation LineContinuation :: **** LineTerminatorSequence

üretiminin TRV'si, 0x005C (REVERSE SOLIDUS) kod birimi ile LineTerminatorSequence'in TRV'sinin dizgi birleştirmesidir.

-

LineTerminatorSequence LineTerminatorSequence ::

üretiminin TRV'si, 0x000A (LINE FEED) kod biriminden oluşan String değeridir.

-

LineTerminatorSequence LineTerminatorSequence ::

üretiminin TRV'si, 0x000A (LINE FEED) kod biriminden oluşan String değeridir.

-

LineTerminatorSequence LineTerminatorSequence ::

üretiminin TRV'si, 0x2028 (LINE SEPARATOR) kod biriminden oluşan String değeridir.

-

LineTerminatorSequence LineTerminatorSequence ::

üretiminin TRV'si, 0x2029 (PARAGRAPH SEPARATOR) kod biriminden oluşan String değeridir.

-

LineTerminatorSequence LineTerminatorSequence ::

üretiminin TRV'si, 0x000A (LINE FEED) kod biriminden oluşan String değeridir.

12.10 Otomatik Noktalı Virgül Ekleme

Çoğu ECMAScript deyimi ve bildirimi bir noktalı virgülle sonlandırılmalıdır. Bu tür noktalı virgüller her zaman kaynak metinde açıkça görünebilir. Ancak, kolaylık sağlamak için, bu tür noktalı virgüller belirli durumlarda kaynak metinden çıkarılabilir. Bu durumlar, bu durumlarda kaynak kod belirteci akışına noktalı virgüllerin otomatik olarak eklendiği söylenerek açıklanır.

12.10.1 Otomatik Noktalı Virgül Ekleme Kuralları

Aşağıdaki kurallarda, "belirteç", madde 12'de açıklandığı gibi geçerli sözcüksel hedef sembolü kullanılarak belirlenen gerçek tanınan sözcüksel belirteç anlamına gelir.

Noktalı virgül eklemenin üç temel kuralı vardır:

  1. Kaynak metin soldan sağa ayrıştırılırken, dilbilgisinin herhangi bir üretimi tarafından izin verilmeyen bir belirteçle (sorunlu belirteç olarak adlandırılır) karşılaşıldığında, aşağıdaki koşullardan bir veya daha fazlası doğruysa, sorunlu belirteçten önce otomatik olarak bir noktalı virgül eklenir:

    • Sorunlu belirteç, önceki belirteçten en az bir LineTerminator ile ayrılmıştır.

    • Sorunlu belirteç }'dir.

    • Önceki belirteç )'dir ve eklenen noktalı virgül daha sonra bir do-while deyiminin (14.7.2) sonlandırıcı noktalı virgülü olarak ayrıştırılacaktır.

  2. Kaynak metin soldan sağa ayrıştırılırken, belirteç girdi akışının sonuna gelindiğinde ve ayrıştırıcı girdi belirteci akışını hedef uçolmayanın tek bir örneği olarak ayrıştıramadığında, girdi akışının sonuna otomatik olarak bir noktalı virgül eklenir.

  3. Kaynak metin soldan sağa ayrıştırılırken, dilbilgisinin bazı üretimleri tarafından izin verilen bir belirteçle karşılaşıldığında, ancak üretim bir kısıtlanmış üretim ise ve belirteç, kısıtlanmış üretim içindeki "[no LineTerminator here]" açıklamasının hemen ardından gelen bir uç veya uçolmayan için ilk belirteç olacaksa (ve bu nedenle böyle bir belirtece kısıtlanmış belirteç denir) ve kısıtlanmış belirteç, önceki belirteçten en az bir LineTerminator ile ayrılmışsa, kısıtlanmış belirteçten önce otomatik olarak bir noktalı virgül eklenir.

Bununla birlikte, önceki kurallar üzerinde ek bir geçersiz kılma koşulu vardır: Eklenecek noktalı virgül daha sonra boş bir deyim olarak ayrıştırılacaksa veya bu noktalı virgül bir for deyiminin başlığındaki iki noktalı virgülden biri olacaksa, asla otomatik olarak bir noktalı virgül eklenmez (bkz. 14.7.4).

12.10.2 Otomatik Noktalı Virgül Ekleme Örnekleri

Bu bölüm normatif değildir.

Kaynak

{ 1 2 } 3

otomatik noktalı virgül ekleme kurallarıyla bile ECMAScript dilbilgisinde geçerli bir tümce değildir. Buna karşılık, kaynak

{ 1 2 } 3

da geçerli bir ECMAScript tümcesi değildir, ancak otomatik noktalı virgül ekleme ile aşağıdaki şekle dönüştürülür:

{ 1
;2 ;} 3;

ki bu geçerli bir ECMAScript tümcesidir.

Kaynak

for (a; b
)

geçerli bir ECMAScript tümcesi değildir ve otomatik noktalı virgül ekleme ile değiştirilmez, çünkü noktalı virgül bir for deyiminin başlığı için gereklidir. Otomatik noktalı virgül ekleme, bir for deyiminin başlığındaki iki noktalı virgülden birini asla eklemez.

Kaynak

return
a + b

otomatik noktalı virgül ekleme ile aşağıdaki şekle dönüştürülür:

return;
a + b;

Kaynak

a = b
++c

otomatik noktalı virgül ekleme ile aşağıdaki şekle dönüştürülür:

a = b;
++c;

Kaynak

if (a > b)
else c = d

geçerli bir ECMAScript tümcesi değildir ve else belirtecinden önce otomatik noktalı virgül ekleme ile değiştirilmez, çünkü dilbilgisinin hiçbir üretimi bu noktada uygulanmasa bile, otomatik olarak eklenen bir noktalı virgül daha sonra boş bir deyim olarak ayrıştırılırdı.

Kaynak

a = b + c
(d + e).print()

otomatik noktalı virgül ekleme ile dönüştürülmez, çünkü ikinci satırı başlatan parantezli ifade, bir işlev çağrısı için argüman listesi olarak yorumlanabilir:

a = b + c(d + e).print()

Bir atama deyiminin bir sol parantezle başlaması gerektiği durumda, programcının otomatik noktalı virgül eklemeye güvenmek yerine önceki deyimin sonunda açık bir noktalı virgül sağlaması iyi bir fikirdir.

12.10.3 Otomatik Noktalı Virgül Eklemenin İlginç Durumları

Bu bölüm normatif değildir.

ECMAScript programları, otomatik noktalı virgül eklemeye güvenerek çok az noktalı virgül içeren bir tarzda yazılabilir. Yukarıda açıklandığı gibi, her yeni satırda noktalı virgül eklenmez ve otomatik noktalı virgül ekleme, satır sonlandırıcılar arasındaki birden fazla belirtece bağlı olabilir.

ECMAScript'e yeni sözdizimsel özellikler eklendikçe, kendilerinden önce gelen otomatik noktalı virgül eklemeye dayanan satırların, ayrıştırıldıklarında dilbilgisi üretimlerini değiştirmesine neden olabilecek ek dilbilgisi üretimleri eklenebilir.

Bu bölümün amaçları bakımından, bir otomatik noktalı virgül ekleme durumu, kendisinden önce gelen kaynak metne bağlı olarak bir noktalı virgülün eklenip eklenmeyebileceği bir yer ise ilginç kabul edilir. Bu bölümün geri kalanı, ECMAScript'in bu sürümündeki bir dizi ilginç otomatik noktalı virgül ekleme durumunu açıklar.

12.10.3.1 Deyim Listelerinde Otomatik Noktalı Virgül Eklemenin İlginç Durumları

Bir StatementList içinde, birçok StatementListItem noktalı virgülle biter ve bunlar otomatik noktalı virgül ekleme kullanılarak çıkarılabilir. Yukarıdaki kuralların bir sonucu olarak, bir ifadeyi sonlandıran bir satırın sonunda, aşağıdaki satır aşağıdakilerden herhangi biriyle başlıyorsa bir noktalı virgül gereklidir:

  • Bir açma parantezi ((). Noktalı virgül olmadan, iki satır birlikte bir CallExpression olarak ele alınır.

  • Bir açma köşeli parantez ([). Noktalı virgül olmadan, iki satır birlikte bir ArrayLiteral veya ArrayAssignmentPattern yerine özellik erişimi olarak ele alınır.

  • Bir şablon değişmezi (```). Noktalı virgül olmadan, iki satır birlikte, önceki ifade MemberExpression olarak kullanılarak etiketli bir Şablon (13.3.11) olarak yorumlanır.

  • Tek terimli + veya -. Noktalı virgül olmadan, iki satır birlikte karşılık gelen ikili işlecin bir kullanımı olarak yorumlanır.

  • Bir RegExp değişmezi. Noktalı virgül olmadan, iki satır birlikte, örneğin RegExp'in bayrakları varsa, bunun yerine / MultiplicativeOperator olarak ayrıştırılabilir.

12.10.3.2 Otomatik Noktalı Virgül Ekleme ve “[no LineTerminator here]” Durumları

Bu bölüm normatif değildir.

ECMAScript, “[no LineTerminator here]” içeren dilbilgisi üretimleri içerir. Bu üretimler bazen dilbilgisinde isteğe bağlı işlenenlere sahip olmanın bir yoludur. Bu konumlara bir LineTerminator eklemek, isteğe bağlı işleneni olmayan dilbilgisi üretimini kullanarak bir kaynak metnin dilbilgisi üretimini değiştirirdi.

Bu bölümün geri kalanı, ECMAScript'in bu sürümünde “[no LineTerminator here]” kullanan bir dizi üretimi açıklar.

12.10.3.2.1 İsteğe Bağlı İşlenenler ve “[no LineTerminator here]” İçeren Dilbilgisi Üretimlerinin Listesi