11 ECMAScript Language: Source Text

11.1 Source Text

Syntax

SourceCharacter :: any Unicode code point

ECMAScript source textはUnicode code pointsのsequenceです。surrogate code pointsを含むU+0000からU+10FFFFまでのすべてのUnicode code point valuesは、ECMAScript grammarsによって許可される場所でECMAScript source textに出現してよいです。ECMAScript source textを格納および交換するために使用される実際のencodingsは、この仕様には関係ありません。外部source text encodingにかかわらず、conforming ECMAScript implementationはsource textを、各SourceCharacterがUnicode code pointである、等価なSourceCharacter値のsequenceであるかのように処理します。Conforming ECMAScript implementationsは、source textのnormalizationを実行する必要はなく、source textのnormalizationを実行しているかのように振る舞う必要もありません。

combining character sequenceのcomponentsは、ユーザーがsequence全体を単一のcharacterと考える場合でも、個々のUnicode code pointsとして扱われます。

Note

string literals、regular expression literals、template literalsおよびidentifiersでは、任意のUnicode code pointは、code pointの数値を明示的に表すUnicode escape sequencesを使用して表すこともできます。comment内では、そのようなescape sequenceはcommentの一部として事実上無視されます。

ECMAScriptは、Unicode escape sequencesの振る舞いにおいてJava programming languageとは異なります。Javaプログラムでは、例えばUnicode escape sequence \u000Aがsingle-line comment内に出現した場合、それはline terminator(Unicode code point U+000AはLINE FEED (LF))として解釈されるため、次のcode pointはcommentの一部ではありません。同様に、Unicode escape sequence \u000AがJavaプログラムのstring literal内に出現した場合、それも同様にline terminatorとして解釈されますが、これはstring literal内では許可されません—LINE FEED (LF)をstring literalの値の一部にするには、\u000Aではなく\nと書かなければなりません。ECMAScriptプログラムでは、comment内に出現するUnicode escape sequenceは決して解釈されず、したがってcommentの終了に寄与することはありません。同様に、ECMAScriptプログラムのstring literal内に出現するUnicode escape sequenceは常にliteralに寄与し、line terminatorとして、またはstring literalを終了させる可能性のあるcode pointとして解釈されることはありません。

11.1.1 Static Semantics: UTF16EncodeCodePoint ( codePoint )

The abstract operation UTF16EncodeCodePoint takes argument codePoint (a Unicode code point) and returns a String. It performs the following steps when called:

  1. Assert: 0 ≤ codePoint ≤ 0x10FFFF.
  2. codePoint ≤ 0xFFFFなら、数値がcodePointであるcode unitから成るString値を返す。
  3. cu1を、数値がfloor((codePoint - 0x10000) / 0x400) + 0xD800であるcode unitとする。
  4. cu2を、数値が((codePoint - 0x10000) modulo 0x400) + 0xDC00であるcode unitとする。
  5. cu1cu2string-concatenationを返す。

11.1.2 Static Semantics: CodePointsToString ( text )

The abstract operation CodePointsToString takes argument text (a sequence of Unicode code points) and returns a String. これは、6.1.4で説明されるように、textをString値へ変換します。 It performs the following steps when called:

  1. resultを空のStringとする。
  2. textの各code point codePointについて、以下を行う
    1. resultresultUTF16EncodeCodePoint(codePoint)のstring-concatenationに設定する。
  3. resultを返す。

11.1.3 Static Semantics: UTF16SurrogatePairToCodePoint ( lead, trail )

The abstract operation UTF16SurrogatePairToCodePoint takes arguments lead (a code unit) and trail (a code unit) and returns a code point. UTF-16 surrogate pairを形成する2つのcode unitsはcode pointへ変換されます。 It performs the following steps when called:

  1. Assert: leadleading surrogateであり、trailtrailing surrogateである。
  2. codePointを(lead - 0xD800) × 0x400 + (trail - 0xDC00) + 0x10000とする。
  3. code point codePointを返す。

11.1.4 Static Semantics: CodePointAt ( string, position )

The abstract operation CodePointAt takes arguments string (a String) and position (a non-negative integer) and returns a Record with fields [[CodePoint]] (a code point), [[CodeUnitCount]] (a positive integer), and [[IsUnpairedSurrogate]] (a Boolean). これは、6.1.4で説明されるようにstringをUTF-16 encoded code pointsのsequenceとして解釈し、index positionのcode unitから始まる単一のcode pointをそこから読み取ります。 It performs the following steps when called:

  1. sizestringのlengthとする。
  2. Assert: position ≥ 0 かつ position < size.
  3. firststring内のindex positionにあるcode unitとする。
  4. codePointを、数値がfirstの数値であるcode pointとする。
  5. firstleading surrogateでもtrailing surrogateでもないなら、
    1. Record { [[CodePoint]]: codePoint, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: false }を返す。
  6. firsttrailing surrogate、またはposition + 1 = sizeなら、
    1. Record { [[CodePoint]]: codePoint, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true }を返す。
  7. secondstring内のindex position + 1にあるcode unitとする。
  8. secondtrailing surrogateでないなら、
    1. Record { [[CodePoint]]: codePoint, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true }を返す。
  9. codePointUTF16SurrogatePairToCodePoint(first, second)に設定する。
  10. Record { [[CodePoint]]: codePoint, [[CodeUnitCount]]: 2, [[IsUnpairedSurrogate]]: false }を返す。

11.1.5 Static Semantics: StringToCodePoints ( string )

The abstract operation StringToCodePoints takes argument string (a String) and returns a List of code points. これは、6.1.4で説明されるようにstringをUTF-16 encoded Unicode textとして解釈した結果となるUnicode code pointsのsequenceを返します。 It performs the following steps when called:

  1. codePointsを新しい空のListとする。
  2. sizestringのlengthとする。
  3. positionを0とする。
  4. position < sizeである間、繰り返す
    1. codePointCodePointAt(string, position)とする。
    2. codePoint.[[CodePoint]]codePointsへappendする。
    3. positionposition + codePoint.[[CodeUnitCount]]に設定する。
  5. codePointsを返す。

11.1.6 Static Semantics: ParseText ( sourceText, goalSymbol )

The abstract operation ParseText takes arguments sourceText (a String or a sequence of Unicode code points) and goalSymbol (a nonterminal in one of the ECMAScript grammars) and returns a Parse Node or a non-empty List of SyntaxError objects. It performs the following steps when called:

  1. sourceTextがStringなら、sourceTextStringToCodePoints(sourceText)に設定する。
  2. goalSymbolgoal symbolとして使用してsourceTextのparseを試み、parse resultにearly error conditionsがないか分析する。Parsingとearly error detectionは、implementation-definedな方法でinterleavedされる場合があります。
  3. parseが成功し、early errorsが見つからなかったなら、parseの結果得られたparse treeのrootにあるParse NodegoalSymbolのinstance)を返す。
  4. parsing errorsおよび/またはearly errorsを表す1つ以上のSyntaxError objectsのListを返す。複数のparsing errorまたはearly errorが存在する場合、list内のerror objectsの数および順序はimplementation-definedですが、少なくとも1つは存在しなければなりません。
Note 1

特定の位置にearly errorがあり、さらに後の位置にsyntax errorもあるtextを考えます。parse passに続いてearly errors passを実行する実装は、syntax errorを報告し、early errors passに進まない場合があります。2つのactivitiesをinterleaveする実装は、early errorを報告し、syntax errorを見つける処理に進まない場合があります。第3の実装は両方のerrorsを報告する場合があります。これらのbehavioursはすべてconformantです。

Note 2

clause 17も参照してください。

11.2 Types of Source Code

ECMAScript codeには4つのtypesがあります:

Note 1

Function codeは一般に、Function Definitions(15.2)、Arrow Function Definitions(15.3)、Method Definitions(15.4)、Generator Function Definitions(15.5)、Async Function Definitions(15.8)、Async Generator Function Definitions(15.6)、およびAsync Arrow Functions(15.9)のbodiesとして提供されます。Function codeは、Function constructor20.2.1.1)、GeneratorFunction constructor27.6.1.1)、AsyncFunction constructor27.10.1.1)、およびAsyncGeneratorFunction constructor27.7.1.1)へのargumentsからもderivedされます。

Note 2

BindingIdentifierをfunction codeに含めることの実際上の効果は、strict mode codeに対するEarly Errorsが、周囲のcodeがstrict mode codeでない場合でも、bodyにUse Strict Directiveを含むfunctionの名前であるBindingIdentifierに適用されることです。

11.2.1 Directive Prologues and the Use Strict Directive

Directive Prologueは、FunctionBodyScriptBody、またはModuleBodyの初期StatementListItemsまたはModuleItemsとして出現するExpressionStatementsの最長sequenceであり、そのsequence内の各ExpressionStatementが、semicolonに続くStringLiteral tokenのみで構成されるものです。semicolonは明示的に現れてもよく、automatic semicolon insertion(12.10)によって挿入されてもよいです。Directive Prologueは空のsequenceであってもよいです。

Use Strict Directiveは、Directive Prologue内のExpressionStatementであり、そのStringLiteralが正確なcode point sequences "use strict"または'use strict'のいずれかであるものです。Use Strict DirectiveEscapeSequenceまたはLineContinuationを含んではなりません。

Directive Prologueは複数のUse Strict Directiveを含む場合があります。ただし、実装はこれが発生した場合にwarningを発してよいです。

Note

Directive PrologueExpressionStatementsは、含むproductionの評価中に通常どおり評価されます。実装は、Use Strict DirectiveではなくDirective Prologue内に出現するExpressionStatementsについて、implementation specificな意味を定義してよいです。適切なnotification mechanismが存在する場合、実装は、Directive Prologue内で、Use Strict Directiveではなく、かつ実装によって定義された意味を持たないExpressionStatementに遭遇した場合、warningを発するべきです。

11.2.2 Strict Mode Code

ECMAScript syntactic unitは、unrestrictedまたはstrict mode syntax and semantics(4.3.2)のいずれかを使用して処理される場合があります。Codeは次の状況でstrict mode codeとして解釈されます:

strict mode codeではないECMAScript codeはnon-strict codeと呼ばれます。

11.2.2.1 Static Semantics: IsStrict ( parseNode )

The abstract operation IsStrict takes argument parseNode (a Parse Node) and returns a Boolean. It performs the following steps when called:

  1. parseNodeに一致するsource textがstrict mode codeなら、trueを返す。
  2. falseを返す。

11.2.3 Non-ECMAScript Functions

ECMAScript implementationは、評価的振る舞いがECMAScript source text以外のhost-defined formのexecutable codeで表現されるfunction exotic objectsの評価をサポートしてよいです。function objectがECMAScript code内で定義されているか、built-in functionであるかは、そのようなfunction objectを呼び出す、またはそのようなfunction objectによって呼び出されるECMAScript codeの観点からは観測可能ではありません。