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

Gösterim Kuralları

5.1 Sözdizimsel ve Sözcüksel Dilbilgileri

5.1.1 Bağlamdan Bağımsız Dilbilgileri

Bir bağlamdan bağımsız dilbilgisi bir dizi üretimden oluşur. Her üretimin soyut bir sembol olan ve sol tarafı olarak adlandırılan bir uçolmayan ile sağ tarafı olarak sıfır veya daha fazla uçolmayan ve sembolden oluşan bir dizi vardır. Her dilbilgisi için, uç semboller belirli bir alfabeden alınır.

Bir zincir üretimi, sağ tarafında tam olarak bir uçolmayan sembol ile birlikte sıfır veya daha fazla uç sembol bulunan bir üretimdir.

Hedef sembolü olarak adlandırılan tek bir ayırt edici uçolmayandan oluşan bir tümceyle başlayarak, verili bir bağlamdan bağımsız dilbilgisi bir dil belirtir; yani, dizideki herhangi bir uçolmayanın, o uçolmayanın sol taraf olduğu bir üretimin sağ tarafıyla tekrar tekrar değiştirilmesiyle elde edilebilecek (belki de sonsuz) olası uç sembol dizileri kümesini.

5.1.2 Sözcüksel ve RegExp Dilbilgileri

ECMAScript için bir sözcüksel dilbilgisi madde 12'de verilmiştir. Bu dilbilgisinin uç sembolleri olarak, 11.1'de tanımlanan SourceCharacter kurallarına uyan Unicode kod noktaları kullanılır. InputElementDiv, InputElementTemplateTail, InputElementRegExp, InputElementRegExpOrTemplateTail veya InputElementHashbangOrRegExp hedef sembolünden başlayan ve bu tür kod noktası dizilerinin nasıl bir girdi öğeleri dizisine dönüştürüldüğünü açıklayan bir üretimler kümesi tanımlar.

Boşluk ve yorumlar dışındaki girdi öğeleri, ECMAScript'in sözdizimsel dilbilgisi için uç sembolleri oluşturur ve ECMAScript belirteçleri olarak adlandırılır. Bu belirteçler, ECMAScript dilinin ayrılmış sözcükleri, tanımlayıcıları, değişmezleri ve noktalama işaretleridir. Dahası, satır sonlandırıcıları belirteç olarak kabul edilmemekle birlikte, girdi öğeleri akışının bir parçası haline gelir ve otomatik noktalı virgül ekleme sürecine yön verir (12.10). Basit boşluk ve tek satırlık yorumlar atılır ve sözdizimsel dilbilgisi için girdi öğeleri akışında görünmez. Bir MultiLineComment (yani, birden fazla satıra yayılıp yayılmadığına bakılmaksızın /**/ biçimindeki bir yorum), hiç satır sonlandırıcı içermiyorsa aynı şekilde basitçe atılır; ancak bir MultiLineComment bir veya daha fazla satır sonlandırıcı içeriyorsa, o zaman yerine tek bir satır sonlandırıcı konur ve bu, sözdizimsel dilbilgisi için girdi öğeleri akışının bir parçası haline gelir.

ECMAScript için bir RegExp dilbilgisi 22.2.1'de verilmiştir. Bu dilbilgisi de uç sembolleri olarak SourceCharacter ile tanımlanan kod noktalarını kullanır. Pattern hedef sembolünden başlayarak, kod noktası dizilerinin düzenli ifade desenlerine nasıl dönüştürüldüğünü açıklayan bir üretimler kümesi tanımlar.

Sözcüksel ve RegExp dilbilgilerinin üretimleri, ayırıcı noktalama olarak iki iki nokta “::” kullanılmasıyla ayırt edilir. Sözcüksel ve RegExp dilbilgileri bazı üretimleri paylaşır.

5.1.3 Sayısal Dizgi Dilbilgisi

Bir sayısal dizgi dilbilgisi 7.1.4.1'de yer alır. Uç sembolleri olarak SourceCharacter'ı kullanır ve StringNumericLiteral hedef sembolünden başlayarak Dizgileri sayısal değerlere dönüştürmek için kullanılır (bu, sayısal değişmezler için sözcüksel dilbilgisine benzer ancak ondan farklıdır).

Sayısal dizgi dilbilgisinin üretimleri, noktalama olarak üç iki nokta “:::” kullanılmasıyla ayırt edilir ve hiçbir zaman kaynak metnin ayrıştırılmasında kullanılmaz.

5.1.4 Sözdizimsel Dilbilgisi

ECMAScript için sözdizimsel dilbilgisi 13 ila 16 maddelerinde verilmiştir. Bu dilbilgisi, sözcüksel dilbilgisi tarafından tanımlanan ECMAScript belirteçlerini uç sembolleri olarak kullanır (5.1.2). İki alternatif hedef sembolü olan Script ve Module'den başlayarak, belirteç dizilerinin ECMAScript programlarının sözdizimsel olarak doğru bağımsız bileşenlerini nasıl oluşturduğunu açıklayan bir üretimler kümesi tanımlar.

Bir kod noktası akışı, ECMAScript Script veya Module olarak ayrıştırılacağı zaman, önce sözcüksel dilbilgisinin tekrarlı uygulanmasıyla bir girdi öğeleri akışına dönüştürülür; bu girdi öğeleri akışı daha sonra sözdizimsel dilbilgisinin tek bir uygulamasıyla ayrıştırılır. Girdi öğeleri akışındaki belirteçler, hiç belirteç artmaksızın hedef uçolmayanın (Script veya Module) tek bir örneği olarak ayrıştırılamazsa, girdi akışı sözdizimsel olarak hatalıdır.

Bir ayrıştırma başarılı olduğunda, her düğümün bir Ayrıştırma Düğümü olduğu köklü bir ağaç yapısı olan bir ayrıştırma ağacı oluşturur. Her Ayrıştırma Düğümü, dilbilgisindeki bir sembolün bir örneğidir; o sembolden türetilebilen kaynak metnin bir aralığını temsil eder. Ayrıştırma ağacının, kaynak metnin bütününü temsil eden kök düğümü, ayrıştırmanın hedef sembolünün bir örneğidir. Bir Ayrıştırma Düğümü bir uçolmayanın örneği olduğunda, aynı zamanda o uçolmayanı sol tarafı olarak alan bir üretimin de örneğidir. Dahası, üretimin sağ tarafındaki her sembol için bir tane olmak üzere sıfır veya daha fazla çocuğu vardır: her çocuk, karşılık gelen sembolün bir örneği olan bir Ayrıştırma Düğümüdür.

Yeni Ayrıştırma Düğümleri, ayrıştırıcının her çağrılışı için oluşturulur ve özdeş kaynak metin için bile ayrıştırmalar arasında asla yeniden kullanılmaz. Ayrıştırma Düğümleri, ancak ve ancak aynı kaynak metin aralığını temsil ediyorlarsa, aynı dilbilgisi sembolünün örnekleriyseler ve aynı ayrıştırıcı çağrısından kaynaklanmışlarsa aynı Ayrıştırma Düğümü olarak kabul edilir.

Sözdizimsel dilbilgisinin üretimleri, noktalama olarak yalnızca tek bir iki nokta “:” kullanılmasıyla ayırt edilir.

13 ila 16 maddelerinde sunulan sözdizimsel dilbilgisi, hangi belirteç dizilerinin doğru bir ECMAScript Script veya Module olarak kabul edildiğinin tam bir açıklaması değildir. Belirli ek belirteç dizileri de kabul edilir; yani, diziye yalnızca belirli yerlerde (örneğin satır sonlandırıcı karakterlerinden önce) noktalı virgül eklenmiş olsaydı dilbilgisi tarafından açıklanacak olanlar. Ayrıca, bir satır sonlandırıcı karakteri belirli “sakıncalı” yerlerde göründüğünde, dilbilgisi tarafından açıklanan bazı belirteç dizileri kabul edilebilir sayılmaz.

Bazı durumlarda, belirsizlikleri önlemek amacıyla, sözdizimsel dilbilgisi, geçerli bir ECMAScript Script veya Module oluşturmayan belirteç dizilerine izin veren genelleştirilmiş üretimler kullanır. Örneğin, bu teknik nesne değişmezleri ve nesne yapıbozum desenleri için kullanılır. Bu gibi durumlarda, kabul edilebilir belirteç dizilerini daha da kısıtlayan daha sınırlayıcı bir tamamlayıcı dilbilgisi sağlanır. Tipik olarak, bir erken hata kuralı daha sonra, belirli bağlamlarda, “p bir n'yi kapsamalıdır” der; burada p bir Ayrıştırma Düğümüdür (genelleştirilmiş üretimin bir örneği) ve n tamamlayıcı dilbilgisinden bir uçolmayandır. Bu şu anlama gelir:

  1. Başlangıçta p tarafından eşleşen belirteç dizisi, n hedef sembolü olarak kullanılarak yeniden ayrıştırılır. Eğer n dilbilgisel parametreler alıyorsa, bunlar p ilk ayrıştırıldığında kullanılan değerlere ayarlanır.

  2. Eğer belirteç dizisi, hiç belirteç artmaksızın n'nin tek bir örneği olarak ayrıştırılabilirse, o zaman:

    1. n'nin o örneğine (belirli bir p için benzersiz bir Ayrıştırma Düğümü) “p tarafından kapsanan n” olarak atıfta bulunuruz.

    2. n ve ondan türeyen üretimler için tüm Erken Hata kuralları, p tarafından kapsanan n için de geçerlidir.

  3. Aksi takdirde (ayrıştırma başarısız olursa), bu bir erken Sözdizimi Hatasıdır.

5.1.5 Dilbilgisi Gösterimi

5.1.5.1 Uç Semboller

ECMAScript dilbilgilerinde, bazı uç semboller sabit genişlikli yazı tipinde gösterilir. Bunlar kaynak metinde tam olarak yazıldığı gibi görünmelidir. Bu şekilde belirtilen tüm uç sembol kod noktaları, diğer Unicode aralıklarındaki benzer görünümlü kod noktalarının aksine, Temel Latin bloğundan uygun Unicode kod noktaları olarak anlaşılmalıdır. Bir uç semboldeki bir kod noktası, bir \ UnicodeEscapeSequence ile ifade edilemez.

Uç sembolleri bireysel Unicode kod noktaları olan dilbilgilerinde (yani sözcüksel, RegExp ve sayısal dizgi dilbilgileri), bir üretimde görünen birden fazla sabit genişlikli kod noktasının bitişik bir dizisi, bağımsız uç semboller olarak yazılmış aynı kod noktası dizisi için basit bir kısayoldur.

Örneğin, üretim:

HexIntegerLiteral HexIntegerLiteral :: 0x HexDigits

şunun için bir kısayoldur:

HexIntegerLiteral HexIntegerLiteral :: 0 x HexDigits

Buna karşılık, sözdizimsel dilbilgisinde, bitişik sabit genişlikli kod noktaları dizisi tek bir uç semboldür.

Uç semboller iki başka biçimde daha bulunur:

  • Sözcüksel ve RegExp dilbilgilerinde, geleneksel basılı bir temsili olmayan Unicode kod noktaları, bunun yerine “” biçiminde gösterilir; burada “KISALTMA” kod noktası veya kod noktaları kümesi için bir anımsatıcıdır. Bu biçimler Unicode Biçim Denetim Karakterleri, Boşluk ve Satır Sonlandırıcıları bölümlerinde tanımlanmıştır.

  • Sözdizimsel dilbilgisinde, belirli uç semboller (örneğin IdentifierName ve RegularExpressionLiteral) italik olarak gösterilir, çünkü sözcüksel dilbilgisindeki aynı isimli uçolmayanlara atıfta bulunurlar.

5.1.5.2 Uçolmayan Semboller ve Üretimler

Uçolmayan semboller italik yazı tipinde gösterilir. Bir uçolmayanın tanımı (bir “üretim” olarak da adlandırılır), tanımlanan uçolmayanın adının ardından bir veya daha fazla iki nokta üst üste getirilerek sunulur. (İki nokta sayısı, üretimin hangi dilbilgisine ait olduğunu belirtir.) Daha sonra, uçolmayan için bir veya daha fazla alternatif sağ taraf ardışık satırlarda yer alır. Örneğin, sözdizimsel tanım:

WhileStatement WhileStatement : while ( Expression ) Statement

WhileStatement uçolmayanının, while belirtecini, ardından bir sol parantez belirtecini, ardından bir Expression, ardından bir sağ parantez belirtecini, ardından bir Statement'i temsil ettiğini belirtir. Expression ve Statement geçişleri kendileri de birer uçolmayandır. Başka bir örnek olarak, sözdizimsel tanım:

ArgumentList ArgumentList : AssignmentExpression ArgumentList , AssignmentExpression

bir ArgumentList'in ya tek bir AssignmentExpression'i ya da bir ArgumentList, ardından bir virgül, ardından bir AssignmentExpression'i temsil edebileceğini belirtir. ArgumentList'in bu tanımı özyinelidir, yani kendisi cinsinden tanımlanmıştır. Sonuç olarak, bir ArgumentList, virgüllerle ayrılmış ve her bir argüman ifadesinin bir AssignmentExpression olduğu herhangi bir pozitif sayıda argüman içerebilir. Uçolmayanların bu tür özyineli tanımları yaygındır.

5.1.5.3 İsteğe Bağlı Semboller

Bir uç veya uçolmayan sembolden sonra gelebilen “opt” alt indisli eki, isteğe bağlı bir sembolü belirtir. İsteğe bağlı sembolü içeren alternatif aslında iki sağ taraf belirtir; biri isteğe bağlı öğeyi dışarıda bırakır, diğeri onu içerir. Bu şu anlama gelir:

VariableDeclaration VariableDeclaration : BindingIdentifier Initializeropt

şunun için uygun bir kısaltmadır:

VariableDeclaration VariableDeclaration : BindingIdentifier BindingIdentifier Initializer

ve:

ForStatement ForStatement : for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement

şunun için uygun bir kısaltmadır:

ForStatement ForStatement : for ( LexicalDeclaration ; Expressionopt ) Statement for ( LexicalDeclaration Expression ; Expressionopt ) Statement

ki bu da sırasıyla şunun kısaltmasıdır:

ForStatement ForStatement : for ( LexicalDeclaration ; ) Statement for ( LexicalDeclaration ; Expression ) Statement for ( LexicalDeclaration Expression ; ) Statement for ( LexicalDeclaration Expression ; Expression ) Statement

dolayısıyla, bu örnekte, ForStatement uçolmayanı aslında dört alternatif sağ tarafa sahiptir.

5.1.5.4 Dilbilgisel Parametreler

Bir üretim, üretim tarafından tanımlanan uçolmayan sembole bir ek olarak görünebilen “[parameters]” biçiminde bir alt indisli açıklama ile parametrelendirilebilir. “parameters” tek bir ad veya virgülle ayrılmış adlar listesi olabilir. Parametrelenmiş bir üretim, parametre adlarının tüm birleşimlerini, önüne bir alt çizgi eklenerek parametrelendirilmiş uçolmayan sembole eklenmesiyle tanımlayan bir üretimler kümesi için bir kısayoldur. Bu şu anlama gelir:

StatementList StatementList[Return] : ReturnStatement ExpressionStatement

şunun için uygun bir kısaltmadır:

StatementList StatementList : ReturnStatement ExpressionStatement

StatementList_Return StatementList_Return : ReturnStatement ExpressionStatement

ve:

StatementList StatementList[Return, In] : ReturnStatement ExpressionStatement

şunun bir kısaltmasıdır:

StatementList StatementList : ReturnStatement ExpressionStatement

StatementList_Return StatementList_Return : ReturnStatement ExpressionStatement

StatementList_In StatementList_In : ReturnStatement ExpressionStatement

StatementList_Return_In StatementList_Return_In : ReturnStatement ExpressionStatement

Birden fazla parametre, birleşimsel sayıda üretim üretir ve bunların tümüne tam bir dilbilgisinde mutlaka atıfta bulunulması gerekmez.

Bir üretimin sağ tarafındaki uçolmayanlara yapılan atıflar da parametrelendirilebilir. Örneğin:

StatementList StatementList : ReturnStatement ExpressionStatement[+In]

şunu söylemeye eşdeğerdir:

StatementList StatementList : ReturnStatement ExpressionStatement_In

ve:

StatementList StatementList : ReturnStatement ExpressionStatement[~In]

şuna eşdeğerdir:

StatementList StatementList : ReturnStatement ExpressionStatement

Bir uçolmayan atfı hem bir parametre listesine hem de bir “opt” ekine sahip olabilir. Örneğin:

VariableDeclaration VariableDeclaration : BindingIdentifier Initializer[+In]opt

şunun bir kısaltmasıdır:

VariableDeclaration VariableDeclaration : BindingIdentifier BindingIdentifier Initializer_In

Bir sağ taraf uçolmayan atfında bir parametre adının önüne “?” eklemek, o parametre değerini, geçerli üretimin sol taraf sembolüne yapılan atıfta parametre adının bulunmasına bağımlı hale getirir. Örneğin:

VariableDeclaration VariableDeclaration[In] : BindingIdentifier Initializer[?In]

şunun bir kısaltmasıdır:

VariableDeclaration VariableDeclaration : BindingIdentifier Initializer

VariableDeclaration_In VariableDeclaration_In : BindingIdentifier Initializer_In

Bir sağ taraf alternatifi “[+parameter]” ile ön eklenmişse, bu alternatif yalnızca adlandırılmış parametre, üretimin uçolmayan sembolüne atıfta bulunulurken kullanılmışsa mevcuttur. Bir sağ taraf alternatifi “[~parameter]” ile ön eklenmişse, bu alternatif yalnızca adlandırılmış parametre, üretimin uçolmayan sembolüne atıfta bulunulurken kullanılmamışsa mevcuttur. Bu şu anlama gelir:

StatementList StatementList[Return] : [+Return] ReturnStatement ExpressionStatement

şunun bir kısaltmasıdır:

StatementList StatementList : ExpressionStatement

StatementList_Return StatementList_Return : ReturnStatement ExpressionStatement

ve:

StatementList StatementList[Return] : [~Return] ReturnStatement ExpressionStatement

şunun bir kısaltmasıdır:

StatementList StatementList : ReturnStatement ExpressionStatement

StatementList_Return StatementList_Return : ExpressionStatement

5.1.5.5 one of

Bir dilbilgisi tanımında iki nokta(lar)ın ardından “one of” sözcükleri geldiğinde, bu, izleyen satır veya satırlardaki uç sembollerin her birinin bir alternatif tanım olduğunu belirtir. Örneğin, ECMAScript için sözcüksel dilbilgisi şu üretimi içerir:

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

ki bu yalnızca şunun uygun bir kısaltmasıdır:

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

5.1.5.6 [empty]

Eğer “[empty]” ifadesi bir üretimin sağ tarafı olarak görünürse, bu, üretimin sağ tarafının hiçbir uç veya uçolmayan sembol içermediğini belirtir.

5.1.5.7 İleriye Bakış Kısıtlamaları

Eğer “[lookahead = seq]” ifadesi bir üretimin sağ tarafında görünürse, bu, üretimin yalnızca seq belirteç dizisi, hemen takip eden girdi belirteç dizisinin bir ön eki ise kullanılabileceğini belirtir. Benzer şekilde, “[lookahead ∈ set]”, burada set sonlu, boş olmayan bir belirteç dizileri kümesidir, üretimin yalnızca set'in bir öğesi, hemen takip eden belirteç dizisinin bir ön eki ise kullanılabileceğini belirtir. Kolaylık olması için, küme aynı zamanda bir uçolmayan olarak da yazılabilir; bu durumda, o uçolmayanın genişleyebileceği tüm belirteç dizilerinin kümesini temsil eder. Eğer uçolmayan sonsuz sayıda farklı belirteç dizisine genişleyebiliyorsa, bu bir yazım hatası olarak kabul edilir.

Bu koşullar olumsuzlanabilir. “[lookahead ≠ seq]”, içeren üretimin yalnızca seq, hemen takip eden girdi belirteç dizisinin bir ön eki değilse kullanılabileceğini belirtir ve “[lookahead ∉ set]” üretimin yalnızca set'in hiçbir öğesi, hemen takip eden belirteç dizisinin bir ön eki değilse kullanılabileceğini belirtir.

Örnek olarak, şu tanımlar verildiğinde:

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

DecimalDigits DecimalDigits :: DecimalDigit DecimalDigits DecimalDigit

şu tanım:

LookaheadExample LookaheadExample :: n [lookahead ∉ { 1, 3, 5, 7, 9 }] DecimalDigits DecimalDigit [lookahead ∉ DecimalDigit]

ya n harfinin ardından ilki çift olan bir veya daha fazla ondalık basamağı ya da ardından başka bir ondalık basamak gelmeyen bir ondalık basamağı eşleştirir.

Bu ifadeler sözdizimsel dilbilgisinde kullanıldığında, hemen takip eden belirteç dizisini açık bir şekilde tanımlamanın mümkün olmayabileceğine dikkat edin; çünkü daha sonraki belirteçleri belirlemek, daha sonraki konumlarda hangi sözcüksel hedef sembolünün kullanılacağının bilinmesini gerektirir. Bu nedenle, sözdizimsel dilbilgisinde bunlar kullanıldığında, eğer kullanılacak sözcüksel hedef sembollerinin seçimi, seq'in ortaya çıkan belirteç dizisinin bir ön eki olup olmayacağını değiştirebiliyorsa, bir seq belirteç dizisinin (bir diziler kümesinin parçası dahil) bir ileriye bakış kısıtlamasında görünmesi bir yazım hatası olarak kabul edilir.

5.1.5.8 [no LineTerminator here]

Eğer “[no LineTerminator here]” ifadesi sözdizimsel dilbilginin bir üretiminin sağ tarafında görünürse, bu, üretimin kısıtlanmış bir üretim olduğunu belirtir: belirtilen konumda girdi akışında bir LineTerminator meydana gelirse kullanılamaz. Örneğin, üretim:

ThrowStatement ThrowStatement : throw [no LineTerminator here] Expression ;

throw belirteci ile Expression arasında betikte bir LineTerminator meydana gelirse, bu üretimin kullanılamayacağını belirtir.

Bir LineTerminator'ın bulunması kısıtlanmış bir üretim tarafından yasaklanmadıkça, betiğin sözdizimsel kabul edilebilirliğini etkilemeksizin, girdi öğeleri akışındaki herhangi iki ardışık belirteç arasında herhangi bir sayıda LineTerminator geçişi görünebilir.

5.1.5.9 but not

Bir üretimin sağ tarafı, “but not” ifadesini ve ardından dışlanacak genişlemeleri belirterek belirli genişlemelere izin verilmediğini belirtebilir. Örneğin, üretim:

Identifier Identifier :: IdentifierName but not ReservedWord

Identifier uçolmayanının, aynı kod noktası dizisi ReservedWord'ün yerini alamadığı sürece, IdentifierName'in yerini alabilecek herhangi bir kod noktası dizisi ile değiştirilebileceği anlamına gelir.

5.1.5.10 Tanımlayıcı Deyişler

Son olarak, tüm alternatifleri listelemenin pratik olmayacağı durumlarda, birkaç uçolmayan sembol, sans-serif yazı tipinde tanımlayıcı bir deyişle açıklanır:

SourceCharacter SourceCharacter :: any Unicode code point

5.2 Algoritma Kuralları

Belirtim, bir algoritmadaki adımları belirtmek için genellikle numaralı bir liste kullanır. Bu algoritmalar, ECMAScript dil yapılarının gerekli anlambilimini kesin olarak belirtmek için kullanılır. Algoritmalar, herhangi bir belirli gerçekleştirim tekniğinin kullanımını ima etme amacı taşımaz. Uygulamada, belirli bir özelliği gerçekleştirmek için daha verimli algoritmalar mevcut olabilir.

Algoritmalar, sıralı, virgülle ayrılmış bir takma ad dizisiyle açıkça parametrelendirilebilir; bu adlar, algoritma adımları içerisinde o konuma geçirilen argümana atıfta bulunmak için kullanılabilir. İsteğe bağlı parametreler, köşeli parantezlerle ([ , ad ]) gösterilir ve algoritma adımları içerisinde zorunlu parametrelerden farklı değildir. Bir parametre listesinin sonunda, başında üç nokta (, ...ad) bulunan bir artık parametre görünebilir. Artık parametre, zorunlu ve isteğe bağlı parametrelerin ardından sağlanan tüm argümanları bir Liste içinde yakalar. Eğer böyle bir ek argüman yoksa, bu Liste boş olur.

Algoritma adımları, sıralı alt adımlara bölünebilir. Alt adımlar girintilidir ve kendileri de ayrıca girintili alt adımlara bölünebilir. Alt adımları tanımlamak için anahat numaralandırma kuralları kullanılır; birinci düzey alt adımlar küçük harfli alfabetik karakterlerle, ikinci düzey alt adımlar küçük harfli roma rakamlarıyla etiketlenir. Üçten fazla düzey gerekirse, bu kurallar dördüncü düzeyde sayısal etiketler kullanılarak tekrarlanır. Örneğin:

  1. En üst düzey adım

    1. Alt adım.

    2. Alt adım.

      1. Alt alt adım.

         1. Alt alt alt adım
           
                   1. Alt alt alt alt adım
                     
                               1. Alt alt alt alt alt adım

Bir adım veya alt adım, alt adımlarını koşullandıran bir “if” yüklemi olarak yazılabilir. Bu durumda, alt adımlar yalnızca yüklem doğruysa uygulanır. Bir adım veya alt adım “else” sözcüğüyle başlıyorsa, bu, aynı düzeydeki bir önceki “if” yüklem adımının değillemesi olan bir yüklemdir.

Bir adım, alt adımlarının yinelemeli olarak uygulanmasını belirtmek için “For each” veya “Repeat” ile başlayabilir.

“Assert:” ile başlayan bir adım, algoritmasının değişmez bir koşulunu ileri sürer. Bu tür ileri sürmeler, aksi takdirde örtük kalacak algoritmik değişmezleri açık hale getirmek için kullanılır. Benzer şekilde, “NOTE:” ile başlayan bir adım, yakındaki adımlar için ilgili bağlamı sağlar. İleri sürme adımları ve not adımları kesinlikle bilgilendirme amaçlıdır; ek anlambilimsel gereklilikler eklemezler ve bu nedenle bir gerçekleştirim tarafından denetlenmeleri gerekmez.

Algoritma adımları, “Let x be someValue” biçimini kullanarak herhangi bir değer için adlandırılmış takma adlar bildirebilir. Bu takma adlar başvuru benzeridir; yani hem x hem de someValue aynı temel veriye atıfta bulunur ve birinde yapılan değişiklikler diğerinden görülebilir. Bu başvuru benzeri davranıştan kaçınmak isteyen algoritma adımları, sağ tarafın açıkça bir kopyasını oluşturmalıdır: “Let x be a copy of someValue”, someValue'nun sığ bir kopyasını oluşturur.

Bir kez bildirildikten sonra, bir takma ada sonraki tüm adımlarda atıfta bulunulabilir ve takma adın bildiriminden önceki adımlardan atıfta bulunulmamalıdır. Takma adlar, “Set x to someOtherValue” biçimi kullanılarak değiştirilebilir.

5.2.1 Değerlendirme Sırası

Algoritma adımlarında karmaşık ifadeler göründüğünde, bunların soldan sağa, içten dışa bir sırayla değerlendirildiği anlaşılmalıdır. Örneğin,

  1. Return A(B(), C.[[D]]) + E(F()).

adımı şuna eşdeğerdir:

  1. Let tmp1 be B().

  2. Let tmp2 be C.[[D]].

  3. Let tmp3 be A(tmp1, tmp2).

  4. Let tmp4 be F().

  5. Let tmp5 be E(tmp4).

  6. Let tmp6 be tmp3 + tmp5.

  7. Return tmp6.

burada çeşitli tmpN takma adları geçicidir ve yalnızca bu adımlarda görülebilir.

5.2.2 Soyut İşlemler

Bu belirtimin birden çok yerinde kullanımlarını kolaylaştırmak amacıyla, soyut işlemler olarak adlandırılan bazı algoritmalar adlandırılır ve diğer algoritmalar içerisinden adlarıyla atıfta bulunulabilmeleri için parametreli işlevsel biçimde yazılır. Soyut işlemlere tipik olarak OperationName(arg1, arg2) gibi bir işlevsel uygulama biçemi kullanılarak atıfta bulunulur. Bazı soyut işlemler, sınıf benzeri belirtim soyutlamalarının çok biçimli olarak dağıtılan yöntemleri olarak ele alınır. Bu tür yöntem benzeri soyut işlemlere tipik olarak someValue.OperationName(arg1, arg2) gibi bir yöntem uygulama biçemi kullanılarak atıfta bulunulur.

5.2.3 Sözdizimi Yönelimli İşlemler

Sözdizimi yönelimli bir işlem, tanımı, her biri ECMAScript dilbilgilerinden birine ait bir veya daha fazla üretimle ilişkilendirilmiş algoritmalardan oluşan adlandırılmış bir işlemdir. Birden çok alternatif tanımı olan bir üretim, her bir alternatif için tipik olarak farklı bir algoritmaya sahip olacaktır. Bir algoritma bir dilbilgisi üretimiyle ilişkilendirildiğinde, üretim alternatifinin uç ve uçolmayan sembollerine, sanki algoritmanın parametreleriymiş gibi atıfta bulunabilir. Bu şekilde kullanıldığında, uçolmayan semboller, kaynak metni ayrıştırırken eşleşen asıl alternatif tanımına atıfta bulunur. Bir dilbilgisi üretimi veya ondan türetilen bir Ayrıştırma Düğümü tarafından eşleşen kaynak metin, eşleşmeye katılan ilk uç sembolün başlangıcında başlayan ve eşleşmeye katılan son uç sembolün sonunda biten kaynak metin bölümüdür.

Bir algoritma bir üretim alternatifiyle ilişkilendirildiğinde, alternatif tipik olarak herhangi bir “[ ]” dilbilgisi ek açıklaması olmaksızın gösterilir. Bu tür ek açıklamalar yalnızca alternatifin sözdizimsel tanınmasını etkilemeli ve alternatif için ilişkili anlambilim üzerinde hiçbir etkiye sahip olmamalıdır.

Sözdizimi yönelimli işlemler, aşağıdaki algoritmadaki 1, 3 ve 4 adımlarındaki kurallar kullanılarak bir ayrıştırma düğümü ve isteğe bağlı olarak diğer parametrelerle çağrılır:

  1. Let status be SyntaxDirectedOperation of SomeNonTerminal.

  2. Let someParseNode be the parse of some source text.

  3. Perform SyntaxDirectedOperation of someParseNode.

  4. Perform SyntaxDirectedOperation of someParseNode with argument "value".

Açıkça aksi belirtilmedikçe, tüm zincir üretimleri, o üretimin sol tarafındaki uçolmayana uygulanabilecek her işlem için örtük bir tanıma sahiptir. Örtük tanım, aynı işlemi, varsa aynı parametrelerle, zincir üretiminin yegane sağ tarafındaki uçolmayana yeniden uygular ve ardından sonucu döndürür. Örneğin, bir algoritmanın şu biçimde bir adıma sahip olduğunu varsayalım: “Return Evaluation of Block” ve şu üretimin olduğunu varsayalım:

Block Block : { StatementList }

ancak Evaluation işlemi bu üretimle bir algoritma ilişkilendirmez. Bu durumda, Evaluation işlemi örtük olarak şu biçimde bir ilişkilendirme içerir:

Runtime Semantics: Evaluation

Block Block : { StatementList }

  1. Return Evaluation of StatementList.

5.2.4 Çalışma Zamanı Anlambilimi

Çalışma zamanında çağrılması gereken anlambilimi belirten algoritmalara çalışma zamanı anlambilimi denir. Çalışma zamanı anlambilimi, soyut işlemler veya sözdizimi yönelimli işlemler tarafından tanımlanır.

5.2.4.1 Completion ( completionRecord )

Completion soyut işlemi, completionRecord (bir Completion Record) argümanını alır ve bir Completion Record döndürür. Bir Completion Record döndürüldüğünü vurgulamak için kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: completionRecord bir Completion Record'dır.

  2. Return completionRecord.

5.2.4.2 Throw

Algoritma adımlarında, “throw” sözcüğü, ThrowCompletion çağrısının sonucunu döndürmek için bir kısayoldur. Örneğin,

  1. If result.[[Error]] is not none, throw result.[[Error]].

şuna eşdeğerdir:

  1. If result.[[Error]] is not none, return ThrowCompletion(result.[[Error]]).

Belirli bir türde bir kuraldışı durum fırlatılacağını söyleyen algoritma adımları, fırlatılmak üzere o türde bir kuraldışı durum oluşturur. Örneğin,

  1. Throw a TypeError exception.

şuna eşdeğerdir:

  1. Return ThrowCompletion(a newly created TypeError object).

5.2.4.3 Completion Record'ları Açmak için Kısayollar

“?” ve “!” önekleri, Completion Record'ları açan kısayollar olarak kullanılır. “?”, bir ani tamamlanmayı çağırana yaymak veya aksi takdirde bir normal tamamlanmayı açmak için kullanılır. “!”, bir Completion Record'ın normal olduğunu ileri sürmek ve onu açmak için kullanılır. Biçimsel olarak,

  1. Let result be ? record.

adımı şuna eşdeğerdir:

  1. Assert: record bir Completion Record'dır.

  2. If record is an abrupt completion, return record.

  3. Let result be record.[[Value]].

Benzer şekilde,

  1. Let result be ! record.

adımı şuna eşdeğerdir:

  1. Assert: record bir normal completion'dır.

  2. Let result be record.[[Value]].

“?” veya “!” başka bir bağlamda kullanıldığında, önce bu kural uygulanana kadar Değerlendirme Sırası'nda verilen yeniden yazma uygulanır, sonra bu kural uygulanır. Örneğin,

  1. Perform AO(? Other()).

adımı şu şekilde yeniden yazılabilir:

  1. Let tmp1 be Other().

  2. Let tmp2 be ? tmp1.

  3. Perform AO(tmp2).

bu da sırasıyla şuna genişler:

  1. Let tmp1 be Other().

  2. Assert: tmp1 bir Completion Record'dır.

  3. If tmp1 is an abrupt completion, return tmp1.

  4. Let tmp2 be tmp1.[[Value]].

  5. Perform AO(tmp2).

5.2.4.4 Örtük Normal Tamamlama

Bir Completion Record döndüreceği bildirilen soyut işlemler içindeki algoritmalarda ve tüm yerleşik işlevlerde, döndürülen değer önce NormalCompletion'a geçirilir ve sonuç onun yerine kullanılır. Bu kural, Completion algoritması içinde veya döndürülen değerin o adımda açıkça bir Completion Record olarak işaretlendiği durumlarda uygulanmaz; bu durumlar şunlardır:

Böyle bir soyut işlemden başka herhangi bir yolla bir Completion Record döndürülmesi bir yazım hatasıdır. Örneğin, bu soyut işlemler içinde,

  1. Return true.

şunlardan herhangi biriyle aynı anlama gelir:

  1. Return NormalCompletion(true).

veya

  1. Let completion be NormalCompletion(true).

  2. Return Completion(completion).

veya

  1. Return Completion Record { [[Type]]: normal, [[Value]]: true, [[Target]]: empty }.

? kısayol genişletmesi aracılığıyla, aşağıdaki örneğe izin verildiğine dikkat edin; çünkü genişletilmiş adımlar içinde, ani durumda Completion uygulanmasının sonucu doğrudan döndürülür ve normal durumda, açma işleminden sonra örtük NormalCompletion uygulaması gerçekleşir.

  1. Return ? completion.

Aşağıdaki örnek bir yazım hatası olurdu, çünkü bir Completion Record, o adımda açıklama eklenmeksizin döndürülmektedir.

  1. Let completion be NormalCompletion(true).

  2. Return completion.

5.2.5 Statik Anlambilim

Bağlamdan bağımsız dilbilgileri, bir girdi öğeleri akışının değerlendirilebilecek geçerli bir ECMAScript Script veya Module oluşturup oluşturmadığını tanımlayan tüm kuralları ifade etmek için yeterince güçlü değildir. Bazı durumlarda, ECMAScript algoritma kuralları veya düz yazı gereklilikleri kullanılarak ifade edilebilecek ek kurallara ihtiyaç duyulur. Bu tür kurallar her zaman bir dilbilgisi üretimiyle ilişkilendirilir ve üretimin statik anlambilimi olarak adlandırılır.

Statik Anlambilim Kurallarının adları vardır ve tipik olarak bir algoritma kullanılarak tanımlanırlar. Adlandırılmış Statik Anlambilim Kuralları, dilbilgisi üretimleriyle ilişkilendirilir ve birden çok alternatif tanımı olan bir üretim, genellikle her bir uygulanabilir adlandırılmış statik anlambilim kuralı için her alternatif için ayrı bir algoritmaya sahip olacaktır.

Özel bir statik anlambilim kuralı türü, Erken Hata Kuralıdır. Erken hata kuralları, belirli dilbilgisi üretimleriyle ilişkilendirilen erken hata koşullarını tanımlar (bkz. madde 17). Çoğu erken hata kuralının Evaluation'ı, bu belirtimin algoritmaları içinde açıkça çağrılmaz. Uygun bir gerçekleştirim, bir Script veya Module'ün ilk değerlendirmesinden önce, o Script veya Module'ü ayrıştırmak için kullanılan üretimlerin tüm erken hata kurallarını doğrulamalıdır. Erken hata kurallarından herhangi biri ihlal edilirse, Script veya Module geçersizdir ve değerlendirilemez.

5.2.6 Matematiksel İşlemler

Bu belirtim, aşağıdaki türdeki sayısal değerlere atıfta bulunur:

Bu belirtimin dilinde, sayısal değerler, alt indis ekleri kullanılarak farklı sayısal türler arasında ayırt edilir. 𝔽 alt indisi Numbers'a, alt indisi BigInts'e atıfta bulunur. Alt indis eki olmayan sayısal değerler, matematiksel değerlere atıfta bulunur. Bu belirtim, çoğu sayısal değeri 10 tabanında gösterir; ayrıca 0x ve ardından 0-9 veya A-F rakamları biçimindeki sayısal değerleri 16 tabanlı değerler olarak kullanır.

Genel olarak, bu belirtim, “y'nin uzunluğu” veya “dört onaltılık basamağın temsil ettiği tamsayı ...” gibi ifadelerde olduğu gibi, bir sayısal değere atıfta bulunduğunda, açıkça bir sayısal tür belirtilmeksizin, bu ifade bir matematiksel değere atıfta bulunur. Bir Number veya BigInt değerine atıfta bulunan ifadeler, bu şekilde açıkça belirtilir; örneğin, “... içindeki kod noktalarının sayısı için Number value for” veya “... için BigInt value for”.

Bu belirtimde tamsayı terimi kullanıldığında, aksi belirtilmedikçe, tamsayılar kümesinde bulunan bir matematiksel değere atıfta bulunur. Bu belirtimde tam sayı Number terimi kullanıldığında, matematiksel değeri tamsayılar kümesinde bulunan sonlu bir Number değerine atıfta bulunur.

+, ×, = ve ≥ gibi sayısal işleçler, işlenenlerin türü tarafından belirlenen işlemlere atıfta bulunur. Matematiksel değerlere uygulandığında, işleçler alışıldık matematiksel işlemlere atıfta bulunur. Genişletilmiş matematiksel değerlere uygulandığında, işleçler genişletilmiş gerçek sayılar üzerindeki alışıldık matematiksel işlemlere atıfta bulunur; belirsiz biçimler tanımlanmamıştır ve bu belirtimde kullanımları bir yazım hatası olarak kabul edilmelidir. Numbers'a uygulandığında, işleçler IEEE 754-2019 içindeki ilgili işlemlere atıfta bulunur. BigInts'e uygulandığında, işleçler BigInt'in matematiksel değerine uygulanan alışıldık matematiksel işlemlere atıfta bulunur. Karma türlü işlenenlere (bir Number ve bir matematiksel değer gibi) uygulanan sayısal işleçler tanımlanmamıştır ve bu belirtimde bir yazım hatası olarak kabul edilmelidir.

Matematiksel değerler ile Numbers veya BigInts arasındaki dönüşümler bu belgede her zaman açıktır. Bir matematiksel değer veya genişletilmiş matematiksel değer x'ten bir Number'a dönüşüm, “x için Number value for” veya 𝔽(x) olarak gösterilir ve 6.1.6.1'de tanımlanır. Bir tamsayı x'ten bir BigInt'e dönüşüm, “x için BigInt value for” veya ℤ(x) olarak gösterilir. Bir Number veya BigInt x'ten bir matematiksel değere dönüşüm, “x'in mathematical value of” veya ℝ(x) olarak gösterilir. +0𝔽 ve -0𝔽'ın matematiksel değeri 0 matematiksel değeridir. Sonlu olmayan değerlerin matematiksel değeri tanımlanmamıştır. x'in genişletilmiş matematiksel değeri, sonlu değerler için x'in matematiksel değeri olup, +∞𝔽 ve -∞𝔽 için sırasıyla +∞ ve -∞'dur; NaN için tanımlanmamıştır.

abs(x) matematiksel işlevi, x'in mutlak değerini üretir; bu, x < 0 ise -x, aksi takdirde x'in kendisidir.

ln(x) matematiksel işlevi, x'in doğal logaritmasını üretir. log10(x) matematiksel işlevi, x'in 10 tabanındaki logaritmasını üretir. log2(x) matematiksel işlevi, x'in 2 tabanındaki logaritmasını üretir.

min(x1, x2, … , xN) matematiksel işlevi, x1 ile xN arasındaki matematiksel olarak en küçük olanı üretir. max(x1, x2, ..., xN) matematiksel işlevi, x1 ile xN arasındaki matematiksel olarak en büyük olanı üretir. Bu matematiksel işlevlerin tanım ve değer kümeleri genişletilmiş matematiksel değerlerdir.

x modulo y” gösterimi (y sonlu ve sıfır olmayan olmak zorundadır), abs(k) < abs(y) ve x - k = q × y olacak şekilde bir q tamsayısı için y (veya sıfır) ile aynı işarete sahip bir k değeri hesaplar.

x'i lower ile upper arasında sıkıştırmanın sonucu” ifadesi (burada x bir genişletilmiş matematiksel değer ve lower ile upper, lowerupper olacak şekilde matematiksel değerlerdir), eğer x < lower ise lower'ı, eğer x > upper ise upper'ı, aksi takdirde x'i üretir.

floor(x) matematiksel işlevi, x'ten büyük olmayan en büyük tamsayıyı (+∞'a en yakın) üretir.

truncate(x) matematiksel işlevi, sıfıra doğru yuvarlayarak x'in kesirli kısmını kaldırır; x < 0 ise -floor(-x), aksi takdirde floor(x) üretir.

min, max, abs, floor ve truncate matematiksel işlevleri Numbers ve BigInts için tanımlanmamıştır ve bu yöntemlerin matematiksel değer olmayan argümanlarla herhangi bir kullanımı, bu belirtimde bir yazım hatası olur.

  • a* alt sınırından b üst sınırına kadar bir aralık, aynı sayısal türden, muhtemelen sonsuz, muhtemelen boş bir sayısal değerler kümesidir. Her sınır, dahil veya hariç olarak tanımlanacak, ancak her ikisi birden olmayacaktır. Aşağıdaki gibi dört tür aralık vardır:
  • a'dan (dahil) b'ye (dahil) bir aralık, aynı zamanda a'dan b'ye dahil aralık olarak da adlandırılır; axb olacak şekilde aynı sayısal türdeki tüm x değerlerini içerir ve başka hiçbir şeyi içermez.

  • a'dan (dahil) b'ye (hariç) bir aralık; ax < b olacak şekilde aynı sayısal türdeki tüm x değerlerini içerir ve başka hiçbir şeyi içermez.

  • a'dan (hariç) b'ye (dahil) bir aralık; a < xb olacak şekilde aynı sayısal türdeki tüm x değerlerini içerir ve başka hiçbir şeyi içermez.

  • a'dan (hariç) b'ye (hariç) bir aralık; a < x < b olacak şekilde aynı sayısal türdeki tüm x değerlerini içerir ve başka hiçbir şeyi içermez.

Örneğin, 1'den (dahil) 2'ye (hariç) aralık, 1 dahil ve 2 hariç olmak üzere, 1 ile 2 arasındaki tüm matematiksel değerlerden oluşur. Aralıkları tanımlama amacıyla, -0𝔽 < +0𝔽; dolayısıyla, örneğin, alt sınırı +0𝔽 olan bir dahil aralık, +0𝔽'ı içerir ancak -0𝔽'ı içermez. NaN asla bir aralığa dahil edilmez.

5.2.7 Değer Gösterimi

Bu belirtimde, ECMAScript dil değerleri kalın olarak görüntülenir. Örnekler arasında null, true veya "hello" bulunur. Bunlar, Function.prototype.apply veya let n = 42; gibi ECMAScript kaynak metinlerinden ayırt edilir.

5.2.8 Kimlik

Bu belirtimde, hem belirtim değerleri hem de ECMAScript dil değerleri eşitlik açısından karşılaştırılır. Eşitlik karşılaştırması yapılırken, değerler iki kategoriden birine girer. Kimliği olmayan değerler, tüm doğuştan gelen özellikleri aynıysa — bir tamsayının büyüklüğü veya bir dizinin uzunluğu gibi özellikler — kimliği olmayan diğer değerlere eşittir. Kimliği olmayan değerler, özelliklerinin tam olarak tanımlanmasıyla önceden başvuru olmaksızın ortaya konabilir. Buna karşılık, kimliği olan her değer benzersizdir ve bu nedenle yalnızca kendisine eşittir. Kimliği olan değerler, kimliği olmayan değerler gibidir ancak kimlik adı verilen ek bir tahmin edilemez, değiştirilemez, evrensel olarak benzersiz bir özellik taşırlar. Kimliği olan mevcut değerlere yapılan atıflar, yalnızca onları tanımlayarak ortaya konamaz, çünkü kimliğin kendisi tanımlanamaz; bunun yerine, bu değerlere yapılan atıflar bir yerden başka bir yere açıkça geçirilmelidir. Kimliği olan bazı değerler değişkendir ve bu nedenle özellikleri (kimlikleri hariç) yerinde değiştirilebilir, bu da değerin tüm sahiplerinin yeni özellikleri gözlemlemesine neden olur. Kimliği olmayan bir değer hiçbir zaman kimliği olan bir değere eşit değildir.

Bu belirtimin perspektifinden, “is” sözcüğü, iki değeri eşitlik açısından karşılaştırmak için kullanılır; örneğin “If bool is true, then ...” ve “contains” sözcüğü, eşitlik karşılaştırmalarını kullanarak listelerde bir değer aramak için kullanılır; örneğin “If list contains a Record r such that r.[[Foo]] is true, then ...”. Değerlerin belirtim kimliği, bu karşılaştırmaların sonucunu belirler ve bu belirtimde aksiyomatiktir.

ECMAScript dilinin perspektifinden, dil değerleri SameValue soyut işlemi ve onun geçişli olarak çağırdığı soyut işlemler kullanılarak eşitlik açısından karşılaştırılır. Bu karşılaştırma soyut işlemlerinin algoritmaları, ECMAScript dil değerlerinin dil kimliğini belirler.

Belirtim değerleri için, belirtim kimliği olmayan değerlere örnekler şunları içerir ancak bunlarla sınırlı değildir: matematiksel değerler ve genişletilmiş matematiksel değerler; ECMAScript kaynak metni, vekil çiftleri, Directive Prologues, vb.; UTF-16 kod birimleri; Unicode kod noktaları; enumlar; sözdizimi yönelimli işlemler, konak kancaları, vb. dahil olmak üzere soyut işlemler; ve sıralı çiftler. Belirtim kimliği olan belirtim değerlerine örnekler şunları içerir ancak bunlarla sınırlı değildir: Property Descriptors, PrivateElements, vb. dahil olmak üzere her türlü Record; Ayrıştırma Düğümleri; Listeler; Kümeler ve Bağıntılar; Soyut Kapanışlar; Veri Blokları; Özel Adlar; yürütme bağlamları ve yürütme bağlamı yığınları; etmen imleyicileri; ve WaiterList Records.

Belirtim kimliği, Symbol.for tarafından üretilen Symbol değerleri hariç, tüm ECMAScript dil değerleri için dil kimliği ile uyuşur. Belirtim kimliği olmayan ve dil kimliği olmayan ECMAScript dil değerleri şunlardır: undefined, null, Booleanlar, Dizgiler, Numberlar ve BigIntler. Belirtim kimliği olan ve dil kimliği olan ECMAScript dil değerleri ise, Symbol.for tarafından üretilmeyen Symboller ve Nesnelerdir. Symbol.for tarafından üretilen Symbol değerleri belirtim kimliğine sahiptir, ancak dil kimliğine sahip değildir.