ページ表示設定

11 ECMAScript 言語: ソーステキスト

11.1 ソーステキスト

構文

SourceCharacter :: any Unicode code point

ECMAScript ソーステキストは Unicode コードポイントの列です。U+0000 から U+10FFFF までのすべての Unicode コードポイント値は、サロゲートコードポイントを含め、ECMAScript 文法で許可される箇所の ECMAScript ソーステキストに現れることができます。ECMAScript ソーステキストの保存および交換に実際に使用される符号化方式は、この仕様には関係ありません。外部のソーステキストの符号化方式にかかわらず、適合する ECMAScript 実装は、ソーステキストを、それぞれの SourceCharacter が Unicode コードポイントである、等価な SourceCharacter 値の列であるかのように処理します。適合する ECMAScript 実装は、ソーステキストの正規化を行う必要はなく、ソーステキストの正規化を行っているかのように動作する必要もありません。

結合文字列の構成要素は、利用者には列全体が単一の文字のように見える場合でも、個々の Unicode コードポイントとして扱われます。

注

文字列リテラル、正規表現リテラル、テンプレートリテラル、および識別子では、任意の Unicode コードポイントを、そのコードポイントの数値を明示的に表す Unicode エスケープシーケンスを使用して表すこともできます。コメント内では、このようなエスケープシーケンスは実質的にコメントの一部として無視されます。

ECMAScript は、Unicode エスケープシーケンスの動作において Java プログラミング言語とは異なります。Java プログラムでは、たとえば Unicode エスケープシーケンス \u000A が単一行コメント内に現れると、それは行終端文字(Unicode コードポイント U+000A は LINE FEED (LF))として解釈されるため、次のコードポイントはコメントの一部にはなりません。同様に、Unicode エスケープシーケンス \u000A が Java プログラムの文字列リテラル内に現れた場合も行終端文字として解釈されますが、行終端文字は文字列リテラル内では許可されていないため、文字列リテラルの値に LINE FEED (LF) を含めるには \u000A の代わりに \n と記述しなければなりません。ECMAScript プログラムでは、コメント内に現れる Unicode エスケープシーケンスは決して解釈されないため、コメントの終了に寄与することはありません。同様に、ECMAScript プログラムの文字列リテラル内に現れる Unicode エスケープシーケンスは常にそのリテラルに寄与し、行終端文字として、または文字列リテラルを終了させ得るコードポイントとして解釈されることはありません。

11.1.1 Static Semantics: UTF16EncodeCodePoint ( codePoint )

抽象操作 UTF16EncodeCodePoint。引数 codePoint (Unicode コードポイント)。戻り値:String。 呼び出されると、次の手順を実行する。

  1. 表明: 0 ≤ codePoint ≤ 0x10FFFF。
  2. codePoint ≤ 0xFFFF である場合、数値が codePoint であるコード単位からなる String 値を返す。
  3. cu1 を、数値が floor((codePoint - 0x10000) / 0x400) + 0xD800 であるコード単位とする。
  4. cu2 を、数値が ((codePoint - 0x10000) modulo 0x400) + 0xDC00 であるコード単位とする。
  5. cu1 と cu2 の文字列連結を返す。

11.1.2 Static Semantics: CodePointsToString ( text )

抽象操作 CodePointsToString。引数 text (a sequence of Unicode code points)。戻り値:String。 6.1.4 で説明されているように、text を String 値に変換します。 呼び出されると、次の手順を実行する。

  1. result を空の String とする。
  2. text の各コードポイント codePoint について、次を行う。
    1. result を result と UTF16EncodeCodePoint(codePoint) の文字列連結に設定する。
  3. result を返す。

11.1.3 Static Semantics: UTF16SurrogatePairToCodePoint ( lead, trail )

抽象操作 UTF16SurrogatePairToCodePoint。引数 lead (コード単位) および trail (コード単位)。戻り値:コードポイント。 UTF-16 サロゲートペアを形成する2つのコード単位をコードポイントに変換します。 呼び出されると、次の手順を実行する。

  1. 表明: lead は先行サロゲートであり、trail は後続サロゲートである。
  2. codePoint を (lead - 0xD800) × 0x400 + (trail - 0xDC00) + 0x10000 とする。
  3. コードポイント codePoint を返す。

11.1.4 Static Semantics: CodePointAt ( string, position )

抽象操作 CodePointAt。引数 string (String) および position (非負整数)。戻り値:レコード (フィールド:[[CodePoint]] (コードポイント), [[CodeUnitCount]] (正の整数), [[IsUnpairedSurrogate]] (Boolean))。 6.1.4 で説明されているように、string を UTF-16 で符号化されたコードポイントの列として解釈し、インデックス position にあるコード単位から始まる1つのコードポイントを読み取ります。 呼び出されると、次の手順を実行する。

  1. size を string の長さとする。
  2. 表明: position ≥ 0 かつ position < size。
  3. first を string 内のインデックス position にあるコード単位とする。
  4. codePoint を、数値が first の数値であるコードポイントとする。
  5. first が先行サロゲートでも後続サロゲートでもない場合、
    1. Record { [[CodePoint]]: codePoint, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: false } を返す。
  6. first が後続サロゲートであるか、position + 1 = size である場合、
    1. Record { [[CodePoint]]: codePoint, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true } を返す。
  7. second を string 内のインデックス position + 1 にあるコード単位とする。
  8. second が後続サロゲートでない場合、
    1. Record { [[CodePoint]]: codePoint, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true } を返す。
  9. codePoint を UTF16SurrogatePairToCodePoint(first, second) に設定する。
  10. Record { [[CodePoint]]: codePoint, [[CodeUnitCount]]: 2, [[IsUnpairedSurrogate]]: false } を返す。

11.1.5 Static Semantics: StringToCodePoints ( string )

抽象操作 StringToCodePoints。引数 string (String)。戻り値:リスト (要素:コードポイント)。 6.1.4 で説明されているように、string を UTF-16 で符号化された Unicode テキストとして解釈した結果となる Unicode コードポイントの列を返します。 呼び出されると、次の手順を実行する。

  1. codePoints を新しい空の List とする。
  2. size を string の長さとする。
  3. position を 0 とする。
  4. position < size の間、次を繰り返す。
    1. codePoint を CodePointAt(string, position) とする。
    2. codePoint.[[CodePoint]] を codePoints に追加する。
    3. position を position + codePoint.[[CodeUnitCount]] に設定する。
  5. codePoints を返す。

11.1.6 Static Semantics: ParseText ( sourceText, goalSymbol )

抽象操作 ParseText。引数 sourceText ((String または a sequence of Unicode code points)) および goalSymbol (a nonterminal in one of the ECMAScript grammars)。戻り値:(構文解析ノード または a non-empty List of SyntaxError objects)。 呼び出されると、次の手順を実行する。

  1. sourceText が String である場合、sourceText を StringToCodePoints(sourceText) に設定する。
  2. goalSymbol を目標記号として sourceText の構文解析を試み、構文解析結果について早期エラー条件がないか解析する。構文解析と早期エラー検出は、実装定義の方法で交互に実行してもよい。
  3. 構文解析に成功し、早期エラーが見つからなかった場合、構文解析によって得られた構文木のルートにある Parse Node(goalSymbol のインスタンス)を返す。
  4. 構文解析エラーおよび/または早期エラーを表す1つ以上の SyntaxError オブジェクトの List を返す。複数の構文解析エラーまたは早期エラーが存在する場合、List 内のエラーオブジェクトの個数と順序は実装定義ですが、少なくとも1つは存在しなければならない。
注 1

ある箇所に早期エラーがあり、それより後の箇所に構文エラーもあるテキストを考えます。構文解析パスの後に早期エラーパスを実行する実装は、構文エラーを報告し、早期エラーパスまでは進まない場合があります。2つの処理を交互に実行する実装は、早期エラーを報告し、構文エラーを見つけるところまで進まない場合があります。3つ目の実装は両方のエラーを報告する場合があります。これらの動作はいずれも適合しています。

注 2

箇条 17 も参照してください。

11.2 ソースコードの種類

ECMAScript コードには4つの種類があります。

注 1

関数コードは一般に、関数定義(15.2)、アロー関数定義(15.3)、メソッド定義(15.4)、ジェネレーター関数定義(15.5)、Async 関数定義(15.8)、Async ジェネレーター関数定義(15.6)、および Async アロー関数(15.9)の本体として提供されます。関数コードは、Function コンストラクター(20.2.1.1)、GeneratorFunction コンストラクター(27.6.1.1)、AsyncFunction コンストラクター(27.10.1.1)、および AsyncGeneratorFunction コンストラクター(27.7.1.1)への引数からも生成されます。

注 2

BindingIdentifier を関数コードに含める実際上の効果は、周囲のコードが strict モードコードでない場合でも、本体に Use Strict ディレクティブ を含む関数の名前である BindingIdentifier に strict モードコードの早期エラーが適用されることです。

11.2.1 ディレクティブプロローグと Use Strict ディレクティブ

ディレクティブプロローグは、FunctionBody、ScriptBody、または ModuleBody の最初の StatementListItem または ModuleItem として現れる ExpressionStatement の最長の列であり、その列内の各 ExpressionStatement は、完全に StringLiteral トークンとそれに続くセミコロンだけで構成されます。セミコロンは明示的に現れてもよく、セミコロン自動挿入(12.10)によって挿入されてもかまいません。ディレクティブプロローグは空の列であってもかまいません。

Use Strict ディレクティブは、ディレクティブプロローグ内の ExpressionStatement であり、その StringLiteral がコードポイント列 "use strict" または 'use strict' のいずれかと正確に一致するものです。Use Strict ディレクティブには EscapeSequence または LineContinuation を含めることはできません。

ディレクティブプロローグには複数の Use Strict ディレクティブを含めてもかまいません。ただし、その場合、実装は警告を出してもかまいません。

注

ディレクティブプロローグの ExpressionStatement は、包含する生成規則の評価中に通常どおり評価されます。実装は、Use Strict ディレクティブではなく、ディレクティブプロローグ内に現れる ExpressionStatement に実装固有の意味を定義してもかまいません。適切な通知機構が存在する場合、ディレクティブプロローグ内で Use Strict ディレクティブではなく、かつ実装によって意味が定義されていない ExpressionStatement に遭遇したとき、実装は警告を出すべきです。

11.2.2 Strict モードコード

ECMAScript の構文単位は、制限なしまたは strict モードの構文および意味論(4.3.2)のいずれかを使用して処理できます。コードは、次の場合に strict モードコードとして解釈されます。

strict モードコードではない ECMAScript コードを 非 strict コードと呼びます。

11.2.2.1 Static Semantics: IsStrict ( parseNode )

抽象操作 IsStrict。引数 parseNode (構文解析ノード)。戻り値:Boolean。 呼び出されると、次の手順を実行する。

  1. parseNode に一致するソーステキストが strict モードコードである場合、true を返す。
  2. false を返す。

11.2.3 非 ECMAScript 関数

ECMAScript 実装は、ECMAScript ソーステキスト以外のホスト定義形式の実行可能コードで評価動作が表される関数特殊オブジェクトの評価をサポートしてもかまいません。関数オブジェクトが ECMAScript コード内で定義されているか、組込み関数であるかは、その関数オブジェクトを呼び出す、またはその関数オブジェクトから呼び出される ECMAScript コードからは観測できません。