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。 呼び出されると、次の手順を実行する。
- 表明: 0 ≤ codePoint ≤ 0x10FFFF。
- codePoint ≤ 0xFFFF である場合、数値が codePoint であるコード単位からなる String 値を返す。
- cu1 を、数値が floor((codePoint - 0x10000) / 0x400) + 0xD800 であるコード単位とする。
- cu2 を、数値が ((codePoint - 0x10000) modulo 0x400) + 0xDC00 であるコード単位とする。
- cu1 と cu2 の文字列連結を返す。
11.1.2 Static Semantics: CodePointsToString ( text )
抽象操作 CodePointsToString。引数 text (a sequence of Unicode code points)。戻り値:String。 6.1.4 で説明されているように、text を String 値に変換します。 呼び出されると、次の手順を実行する。
- result を空の String とする。
- text の各コードポイント codePoint について、次を行う。
- result を result と UTF16EncodeCodePoint(codePoint) の文字列連結に設定する。
- result を返す。
11.1.3 Static Semantics: UTF16SurrogatePairToCodePoint ( lead, trail )
抽象操作 UTF16SurrogatePairToCodePoint。引数 lead (コード単位) および trail (コード単位)。戻り値:コードポイント。 UTF-16 サロゲートペアを形成する2つのコード単位をコードポイントに変換します。 呼び出されると、次の手順を実行する。
- 表明: lead は先行サロゲートであり、trail は後続サロゲートである。
- codePoint を (lead - 0xD800) × 0x400 + (trail - 0xDC00) + 0x10000 とする。
- コードポイント 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つのコードポイントを読み取ります。 呼び出されると、次の手順を実行する。
- size を string の長さとする。
- 表明: position ≥ 0 かつ position < size。
- first を string 内のインデックス position にあるコード単位とする。
- codePoint を、数値が first の数値であるコードポイントとする。
- first が先行サロゲートでも後続サロゲートでもない場合、
- Record { [[CodePoint]]: codePoint, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: false } を返す。
- first が後続サロゲートであるか、position + 1 = size である場合、
- Record { [[CodePoint]]: codePoint, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true } を返す。
- second を string 内のインデックス position + 1 にあるコード単位とする。
- second が後続サロゲートでない場合、
- Record { [[CodePoint]]: codePoint, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true } を返す。
- codePoint を UTF16SurrogatePairToCodePoint(first, second) に設定する。
- 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 コードポイントの列を返します。 呼び出されると、次の手順を実行する。
- codePoints を新しい空の List とする。
- size を string の長さとする。
- position を 0 とする。
- position < size の間、次を繰り返す。
- codePoint を CodePointAt(string, position) とする。
- codePoint.[[CodePoint]] を codePoints に追加する。
- position を position + codePoint.[[CodeUnitCount]] に設定する。
- 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)。 呼び出されると、次の手順を実行する。
- sourceText が String である場合、sourceText を StringToCodePoints(sourceText) に設定する。
- goalSymbol を目標記号として sourceText の構文解析を試み、構文解析結果について早期エラー条件がないか解析する。構文解析と早期エラー検出は、実装定義の方法で交互に実行してもよい。
- 構文解析に成功し、早期エラーが見つからなかった場合、構文解析によって得られた構文木のルートにある Parse Node(goalSymbol のインスタンス)を返す。
- 構文解析エラーおよび/または早期エラーを表す1つ以上の SyntaxError オブジェクトの List を返す。複数の構文解析エラーまたは早期エラーが存在する場合、List 内のエラーオブジェクトの個数と順序は実装定義ですが、少なくとも1つは存在しなければならない。
注 1
ある箇所に早期エラーがあり、それより後の箇所に構文エラーもあるテキストを考えます。構文解析パスの後に早期エラーパスを実行する実装は、構文エラーを報告し、早期エラーパスまでは進まない場合があります。2つの処理を交互に実行する実装は、早期エラーを報告し、構文エラーを見つけるところまで進まない場合があります。3つ目の実装は両方のエラーを報告する場合があります。これらの動作はいずれも適合しています。
注 2