ECMAScriptScriptおよびModuleのソーステキストは、最初に一連の入力要素(トークン、行末記号、コメント、空白)に変換されます。 ソーステキストは左から右にスキャンされ、可能な限り長いコードポイントのシーケンスを次の入力要素として繰り返し取得します。入力された要素の識別が、入力要素を判定している構文文法コンテキストに影響される状況がいくつかあります。入力要素には、レキシカル文法に複数のゴールシンボルが必要です。 InputElementRegExpOrTemplateTailゴールは、RegularExpressionLiteral、TemplateMiddle、またはTemplateTailが許可されている構文文法コンテキストで使用されます。InputElementRegExpゴールシンボルは、RegularExpressionLiteralが許可されていて、TemplateMiddleとTemplateTailは許可されていない構文文法コンテキストで使用されます。InputElementTemplateTailゴールは、TemplateMiddleとTemplateTailが許可されていて、RegularExpressionLiteralが許可されていない構文文法コンテキストで使用されます。他のコンテキストでは、InputElementDivがレキシカルゴールシンボルとして使用されます。
構文:
WhiteSpace
LineTerminator
Comment
CommonToken
RightBracePunctuator
RegularExpressionLiteral
WhiteSpace
LineTerminator
Comment
CommonToken
RegularExpressionLiteral
TemplateSubstitutionTail
WhiteSpace
LineTerminator
Comment
CommonToken
DivPunctuator
TemplateSubstitutionTail
11.1 Unicodeフォーマット制御文字(Unicode Format-Control Characters)
Unicodeフォーマット制御文字(LEFT-TO-RIGHTマークなど、Unicode文字データベースのカテゴリ"Cf"の文字)は、これより上位のプロトコル(マークアップ言語など)がない場合に、一連のテキストのフォーマットを制御するために使用される制御コードです。
編集と表示を容易にするために、ソーステキストのフォーマット制御文字を許可すると便利です。 すべてのフォーマット制御文字は、コメント内、文字列リテラル、テンプレートリテラル、および正規表現リテラル内で使用できます。
U+200C(ZERO WIDTH NON-JOINER)および U+200D(ZERO WIDTH JOINER)は、特定の言語で単語または句の区別を行うために使用されるフォーマット制御文字です。 ECMAScriptソーステキストでは、これらのコードポイントは最初の文字の後のIdentifierNameでも使用できます。
U+FEFF(ZERO WIDTH NO-BREAK SPACE)はフォーマット制御文字です。主にテキストの先頭で使用され、Unicodeとしてマークし、テキストのエンコーディングとバイトオーダーを検出できるようにします。 この目的で使用する<ZWNBSP>文字は、たとえばファイルの連結の結果として、テキストの開始後に表示される場合があります。 ECMAScriptソーステキストでは、<ZWNBSP>コードポイントは空白文字として扱われます(11.2を参照)。
表31は、コメント、文字列リテラル、および正規表現リテラル以外の特定のフォーマット制御文字の扱いをまとめています。
コードポイント | 名称 | 略称 | 使用法 |
---|---|---|---|
U+200C | ZERO WIDTH NON-JOINER | <ZWNJ> | IdentifierPart |
U+200D | ZERO WIDTH JOINER | <ZWJ> | IdentifierPart |
U+FEFF | ZERO WIDTH NO-BREAK SPACE | <ZWNBSP> | WhiteSpace |
11.2 ホワイトスペース(White Space)
空白(White Space)コードポイントは、ソーステキストの読みやすさを向上させ、トークン(分割できない字句単位)を互いに分離するために使用されます。それ以外は重要ではありません。空白コードポイントは、任意の2つのトークン間、および入力の開始または終了時に発生する可能性があります。 空白コードポイントは、StringLiteral、RegularExpressionLiteral、Template、またはTemplateSubstitutionTail内で発生する可能性があり、リテラル値の一部を形成する重要なコードポイントと見なされます。 コメント内でも発生する可能性がありますが、他の種類のトークン内では使用できません。
ECMAScript空白コードポイントを表32に示します。
コードポイント | 名称 | 略称 |
---|---|---|
U+0009 | CHARACTER TABULATION | <TAB> |
U+000B | LINE TABULATION | <VT> |
U+000C | FORM FEED (FF) | <FF> |
U+0020 | SPACE | <SP> |
U+00A0 | NO-BREAK SPACE | <NBSP> |
U+FEFF | ZERO WIDTH NO-BREAK SPACE | <ZWNBSP> |
他のカテゴリ"Zs" | その他のUnicode "Space_Separator"コードポイント | <USP> |
ECMAScript実装は、"Space_Separator"("Zs")カテゴリにリストされているWhiteSpaceコードポイントとして認識する必要があります。
構文:
11.3 ラインターミネーター(Line Terminators)
空白コードポイントと同様に、ラインターミネータ(行末記号)コードポイントは、ソーステキストの読みやすさを向上させ、トークン(分割できない字句単位)を互いに分離するために使用されます。ただし、空白コードポイントとは異なり、ラインターミネータは構文文法の動作に影響を与えます。ラインターミネータは任意の2つのトークン間に出現する可能性がありますが、構文文法で禁止されている箇所がいくつかあります。ラインターミネータは、セミコロンの自動挿入のプロセスにも影響します(11.9)。StringLiteral、Template、TemplateSubstitutionTail以外のトークン内では、ラインターミネータを使用できません。 <LF>および<CR>行ターミネーターは、LineContinuationの一部として以外は、StringLiteralトークン内に出現できません。
ラインターミネータは、MultiLineComment内に出現できますが、SingleLineComment内には出現できません。
ラインターミネータは、正規表現の\sクラスと一致する空白コードポイントのセットに含まれています。
ECMAScriptのラインターミネータ(行末記号)コードポイントを表33に示します。
コードポイント | Unicode名 | 略称 |
---|---|---|
U+000A | LINE FEED (LF) | <LF> |
U+000D | CARRIAGE RETURN (CR) | <CR> |
U+2028 | LINE SEPARATOR | <LS> |
U+2029 | PARAGRAPH SEPARATOR | <PS> |
表33のUnicodeコードポイントのみがラインターミネータとして扱われます。 その他の新しい行または改行Unicodeコードポイントは、ラインターミネータとして扱われませんが、表32にリストされている要件を満たしている場合は空白として扱われます。シーケンス<CR><LF>はラインターミネータとして使用されますが、 行番号を報告するためには、単一のSourceCharacterと見なす必要があります。
構文:
11.4 コメント(Comments)
コメントは単一行または複数行にすることができます。 複数行のコメントはネストできません。
単一行コメントには、LineTerminatorコードポイントを除く任意のUnicodeコードポイントを含めることができます。トークンは可能な限り長いという一般的なルールにより、単一行コメントは//マーカーから行末までのすべてのコードポイントで構成されます。 ただし、行末のLineTerminatorは、単一行コメントの一部とは見なされません。 レキシカル文法によって個別に認識され、構文文法の入力要素のストリームの一部になります。 これは非常に重要です。単一行コメントの有無がセミコロンの自動挿入のプロセスに影響しないことを意味するからです(11.9を参照)。
コメントは空白のように動作し、破棄されます。ただし、MultiLineCommentにラインターミネータコードポイントが含まれている場合、構文文法による解析のためにコメント全体がLineTerminatorと見なされます。
コード /* コメント\n コメント\n コメント */
のとき、
/* から */ までが、改行とみなされる
構文:
MultiLineNotAsteriskChar MultiLineCommentCharsopt
*PostAsteriskCommentCharsopt
MultiLineNotForwardSlashOrAsteriskChar MultiLineCommentCharsopt
*PostAsteriskCommentCharsopt
11.5 トークン(Tokens)
構文:
11.6 名前とキーワード(Names and Keywords)
IdentifierNameとReservedWordは、いくつかの小さな変更を伴う 「Unicode Standard Annex #31, Identifier and Pattern Syntax」での、既定の識別子構文に従って解釈されるトークンです。 ReservedWordは、IdentifierNameの列挙サブセットです。 構文文法では、IdentifierをReservedWordではないIdentifierNameとして定義しています。 Unicode識別子の文法は、Unicode規格で指定されている文字プロパティに基づいています。 最新バージョンのUnicode規格の指定されたカテゴリにあるUnicodeコードポイントは、準拠するすべてのECMAScript実装によって、それらのカテゴリと同様に処理する必要があります。 ECMAScript実装は、Unicode規格の新しいエディションで定義された識別子コードポイントを認識する場合があります。
Unicodeエスケープシーケンスは、IdentifierNameで使用できます。IdentifierNameでは、単一のUnicodeコードポイントが提供されます。コードポイントは、UnicodeEscapeSequenceのCodePointによって表されます(11.8.4を参照)。UnicodeEscapeSequenceの前に\と、uおよび{ }コードユニットがある場合、それらはIdentifierNameにコードポイントを提供しません。UnicodeEscapeSequenceを使用して、コードポイントをIdentifierNameに配置することはできません。つまり、\UnicodeEscapeSequenceシーケンスが、それが提供するSourceCharacterによって置き換えられたとしても、元のIdentifierNameとまったく同じSourceCharacter要素のシーケンスを持つ有効なIdentifierName
である必要があります。この仕様において、すべてのIdentifierNameの解釈は、特定のコードポイントを提供するためにエスケープシーケンスが使用されたかどうかに関係なく、実際のコードポイントに基づきます。
Unicode標準に従って正規に同等である2つのIdentifierNameは、各UnicodeEscapeSequenceを置き換えた後、まったく同じコードポイントのシーケンスで表されない限り、等しくありません。
構文:
非終端UnicodeEscapeSequenceの定義は、11.8.4にあります。
11.6.1 識別子名(Identifier Names)
11.6.1.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
- UnicodeEscapeSequenceのSVが "$"でも "_"でもない場合、またはUnicodeIDStartレキシカル文法生成と一致するコードポイントのUTF16Encodingの場合は、構文エラーです。
UnicodeEscapeSequenceのSVが"$"と"_"以外の場合、または、<ZWNJ>か<ZWJ>のUTF16Encodingの場合、またはUnicodeIDContinueレキシカル文法生成と一致するUnicodeコードポイントのUTF16Encodingの場合は、構文エラーです。
11.6.1.2 静的セマンティクス:StringValue(Static Semantics: StringValue)
- IdentifierNameに一致するソーステキストを idText とする
- idText 内の \UnicodeEscapeSequenceの出現箇所をUnicodeEscapeSequenceで表されるコードポイントに置き換えた結果を、idTextUnescaped とする。
- ! UTF16Encode(idTextUnescaped)を返す
11.6.2 キーワードと予約語(Keywords and Reserved Words)
キーワード
キーワードは、IdentifierNameに一致するトークンです。ただし、一部の構文プロダクション中の固定幅フォントは、その文字通り適用されます。 ECMAScriptのキーワードには、if、while、async、awaitなどが含まれます。
予約語
予約語は、識別子として使用できないIdentifierNameです。 多くのキーワードは予約語ですが、一部はそうではなく、特定のコンテキストでのみ予約されています。 ifとwhileは予約語です。 awaitは、非同期関数およびモジュール内でのみ予約されています。 asyncは予約されていません。 制限なしで変数名またはステートメントラベルとして使用できます。
この仕様では、文法的なプロダクションと早期エラールールの組み合わせを使用して、有効な識別子名と予約語名を指定します。 以下の構文:でReservedWordとしてリストされているすべてのトークンは、awaitとyieldを除いて、無条件に予約されています。awaitとyieldの例外は、12.1でパラメーター化された構文プロダクションを使用して指定されています。 最後に、いくつかの早期エラールールは、有効な識別子の組み合わせを制限します。 12.1.1、13.3.1.1、13.7.5.1、14.6.1を参照してください。 大きく分けて、識別子名には5つのカテゴリがあります。
- 識別子として常に許可されており、キーワードではないもの(Math、window、toString、_など)。
- 識別子として決して許可されないもの(await と yieldを除いて、以下の構文:にリストされているReservedWord)。
- 識別子としてコンテキスト上許可されているもの(await と yield)。
- strictモードコードで、識別子としてコンテキスト上許可されていないもの(let、static、implements、interface、package、private、protected、public)。
- 識別子として常に許可されているが、Identifierが許可されていない場所(as、async、from、get、of、set、target)で特定の構文プロダクション内のキーワードとしても表示されるもの。
条件付きキーワードまたはコンテキストキーワードという用語は、最後の3つのカテゴリに分類されるキーワードを指すために使用されることがあります。そのため、この二つのキーワードは、一部のコンテキストでは識別子として、別のコンテキストではキーワードとして使用できます。
構文:
awaitbreakcasecatchclassconstcontinuedebuggerdefaultdeletedoelseenumexportextendsfalsefinallyforfunctionifimportininstanceofnewnullreturnsuperswitchthisthrowtruetrytypeofvarvoidwhilewithyield
11.7 句読点(Punctuators)
構文:
{()[]....;,<><=>===!====!==+-*%**++--<<>>>>>&|^!~&&||???:=+=-=*=%=**=<<=>>=>>>=&=|=^==>
11.8 リテラル(Literals)
11.8.1 Nullリテラル(Null Literals)
構文:
11.8.2 Booleanリテラル(Boolean Literals)
構文:
11.8.3 数値リテラル(Numeric Literals)
構文:
DecimalLiteral
DecimalBigIntegerLiteral
NonDecimalIntegerLiteral
NonDecimalIntegerLiteral BigIntLiteralSuffix
DecimalIntegerLiteral.DecimalDigitsopt ExponentPartopt
.DecimalDigits ExponentPartopt
DecimalIntegerLiteral ExponentPartopt
NumericLiteralの直後のSourceCharacterは、IdentifierStartまたはDecimalDigitであってはなりません。
B.1.1で説明されているように、準拠実装はstrictモードコードを処理するときに、NumericLiteralの構文を拡張してLegacyOctalIntegerLiteralを含めたり、DecimalIntegerLiteralの構文を拡張してNonOctalDecimalIntegerLiteralを含めたりしてはなりません。
11.8.3.1 静的セマンティクス(Static Semantics):MV
数値リテラルは、Number型またはBigInt型の値を表します。
- NumericLiteral :: DecimalLiteral のMVは、 DecimalLiteral のMV
- NonDecimalIntegerLiteral :: BinaryIntegerLiteral のMVは、BinaryIntegerLiteral のMV
- NonDecimalIntegerLiteral :: OctalIntegerLiteral のMVは、OctalIntegerLiteral のMV
- NonDecimalIntegerLiteral :: HexIntegerLiteral のMVは、HexIntegerLiteral のMV
- DecimalLiteral :: DecimalIntegerLiteral . のMVは、 DecimalIntegerLiteral のMV
- DecimalLiteral :: DecimalIntegerLiteral . DecimalDigits のMVは、 DecimalIntegerLiteral のプラス値のMV(DecimalDigits × 10-nのMV)。nは DecimalDigits のコードポイント数の数学的値です。
- DecimalLiteral :: DecimalIntegerLiteral . ExponentPart のMVは、DecimalIntegerLiteral × 10e のMV。eはExponentPartのMVです。
- DecimalLiteral :: DecimalIntegerLiteral . DecimalDigits ExponentPart のMVは、(DecimalIntegerLiteralのMV + DecimalDigits × 10-nのMV) × 10e です。ここで、nはDecimalDigits のコードポイントの数学的整数で、eはExponentPart のMVです。
- DecimalLiteral :: . DecimalDigits のMVは、DecimalDigits × 10-n のMVです。nは、DecimalDigits内のコードポイントの数学的な整数です
- DecimalLiteral :: . DecimalDigits ExponentPart のMVは、DecimalDigits × 10e-nのMVです。nはDecimalDigitsのコードポイントの数学的整数で、eはExponentPart のMVです。
- DecimalLiteral :: DecimalIntegerLiteral のMVは、 DecimalIntegerLiteral のMVです。
- DecimalLiteral :: DecimalIntegerLiteral ExponentPart の MVは、DecimalIntegerLiteral × 10e のMVです。eは ExponentPart のMVです。
- DecimalIntegerLiteral :: 0 の MVは、 0 のMVです。
- DecimalIntegerLiteral :: NonZeroDigit の MVは、 NonZeroDigit のMVです。
- DecimalIntegerLiteral :: NonZeroDigit DecimalDigits のMVは、(NonZeroDigit のMV × 10n )+ DecimalDigits のMVです。nは、DecimalDigitsのコードポイントの数学的な整数です。
- DecimalDigits :: DecimalDigit のMVは、DecimalDigit のMVです。
- DecimalDigits :: DecimalDigits DecimalDigit のMVは、(DecimalDigits のMV × 10)+ DecimalDigit のMVです。
- ExponentPart :: ExponentIndicator SignedInteger のMVは、SignedInteger のMVです。
- SignedInteger :: DecimalDigits のMVは、DecimalDigits のMVです。
- SignedInteger :: + DecimalDigits のMVは、DecimalDigits のMVです。
- SignedInteger :: - DecimalDigits のMVは、DecimalDigits のMVの負数です。
- DecimalDigit :: 0 、HexDigit :: 0 、 OctalDigit :: 0 、 BinaryDigit :: 0 のMVは、 0 です
- DecimalDigit :: 1 、 NonZeroDigit :: 1 、 HexDigit :: 1 、 OctalDigit :: 1 、 BinaryDigit :: 1 のMVは、1 です
- DecimalDigit :: 2 、 NonZeroDigit :: 2 、 HexDigit :: 2 、 OctalDigit :: 2 のMVは、2 です
- DecimalDigit :: 3 、 NonZeroDigit :: 3 、 HexDigit :: 3 、 OctalDigit :: 3 のMVは、3 です
- DecimalDigit :: 4 、 NonZeroDigit :: 4 、 HexDigit :: 4 、 OctalDigit :: 4 のMVは、4 です
- DecimalDigit :: 5 、 NonZeroDigit :: 5 、 HexDigit :: 5 、 OctalDigit :: 5 のMVは、5 です
- DecimalDigit :: 6 、 NonZeroDigit :: 6 、 HexDigit :: 6 、 OctalDigit :: 6 のMVは、6 です
- DecimalDigit :: 7 、 NonZeroDigit :: 7 、 HexDigit :: 7 、 OctalDigit :: 7 のMVは、7 です
- DecimalDigit :: 8 、 NonZeroDigit :: 8 、 HexDigit :: 8 のMVは、8 です
- DecimalDigit :: 9 、 NonZeroDigit :: 9 、 HexDigit :: 9 のMVは、9 です
- HexDigit :: a 、HexDigit :: A のMVは、10 です
- HexDigit :: b 、HexDigit :: B のMVは、11 です
- HexDigit :: c 、HexDigit :: C のMVは、12 です
- HexDigit :: d 、HexDigit :: D のMVは、13 です
- HexDigit :: e 、HexDigit :: E のMVは、14 です
- HexDigit :: f 、HexDigit :: F のMVは、15 です
- BinaryIntegerLiteral :: 0b BinaryDigits のMVは、BinaryDigits のMVです
- BinaryIntegerLiteral :: 0B BinaryDigits のMVは、BinaryDigits のMVです
- BinaryDigits :: BinaryDigit のMVは、BinaryDigit のMVです
- BinaryDigits :: BinaryDigits BinaryDigit のMVは、BinaryDigits × 2 のMV + BinaryDigit のMVです
- OctalIntegerLiteral :: 0o OctalDigits のMVは、OctalDigits のMVです
- OctalIntegerLiteral :: 0O OctalDigits のMVは、OctalDigits のMVです
- OctalDigits :: OctalDigit のMVは、OctalDigit のMVです
- OctalDigits :: OctalDigits
OctalDigit のMVは、OctalDigits × 8 のMV + OctalDigit のMVです - HexIntegerLiteral :: 0x HexDigits のMVは、HexDigits のMVです
- HexIntegerLiteral :: 0X HexDigits のMVは、HexDigits のMVです
- HexDigits :: HexDigit のMVは、HexDigit のMVです
- HexDigits :: HexDigits HexDigit のMVは、HexDigits × 16 のMV + HexDigit のMVです
- Hex4Digits :: HexDigit HexDigit HexDigit HexDigit のMVは、最初の HexDigit のMVの 0x1000倍 + 2番目の HexDigit のMVの 0x100倍 + 3番目の HexDigit のMVの 0x10倍 + 最後の HexDigit のMVです
11.8.3.2 静的セマンティクス(Static Semantics):NumericValue
- DecimalLiteralのMVを以下の方法により丸めた結果の数値を返す
- NonDecimalIntegerLiteralのMVを以下の方法により丸めた結果の数値を返す
数値リテラルの正確なMVが決定後、数値タイプの値に丸めます。MVが0の場合、丸めた値は+0です。MVが0でなく、リテラルがDecimalLiteralで有効桁数が20桁以下の場合、丸めた値はMVの数値(6.1.6.1)です。この場合、数値は数値のいずれかになります。有効桁数が20桁を超える場合、リテラル上の20桁目以降を0に置き換えた値、または置き換え後20桁目を+1した値のMVのNumber値になります。 ExponentPartの一部ではない場合、数字は有効です。そして、
- それは 0 ではありません。 または、
- 左側にゼロ以外の数字があり、その右側にExponentPartではない非ゼロの数字があります。
- NonDecimalIntegerLiteralのMVを表すBigInt値を返す
- 0を表すBigInt値を返す
- NonZeroDigitのMVを表すBigInt値を返す
- DecimalDigitsのコードポイントの数学的整数 を n とする
- (NonZeroDigit のMV × 10n) + DecimalDigits のMVを mv とする
- mvを表すBigInt値を返す
11.8.4 文字列リテラル(String Literals)
構文:
SourceCharacter " または \ または LineTerminator
<LS>
<PS>
\EscapeSequence
LineContinuation
SourceCharacter ' または \ または LineTerminator
<LS>
<PS>
\EscapeSequence
LineContinuation
CharacterEscapeSequence
0[lookahead ∉ DecimalDigit ]
HexEscapeSequence
UnicodeEscapeSequence
strictモードコードを処理する場合、準拠実装は、B.1.2で説明されているようにLegacyOctalEscapeSequenceを含めるようにEscapeSequenceの構文を拡張してはいけません。
非終端HexDigitの定義は11.8.3にあります。 SourceCharacterは10.1で定義しています。
11.8.4.1 静的セマンティクス(Static Semantics):StringValue
- コード単位がStringLiteralのSVであるString値を返す
11.8.4.2 静的セマンティクス(Static Semantics):SV
文字列リテラルは、String型の値を表します。 String値(SV:String value)は、さまざまなパーツからなる文字列リテラルから生成されます。 一部の生成プロセスでは、文字列リテラル内の一部のUnicodeコードポイントを、以下のリストや11.8.3のように、数学値(MV)として解釈されます。
- StringLiteral :: "" のSVは、空のコードユニットのシーケンスです
- StringLiteral :: '' のSVは、空のコードユニットのシーケンスです
- StringLiteral :: " DoubleStringCharacters " のSVは、 DoubleStringCharacters のSVです
- StringLiteral :: ' SingleStringCharacters ' のSVは、SingleStringCharacters のSVです
- DoubleStringCharacters :: DoubleStringCharacter のSVは、DoubleStringCharacter のSVである最大2つのコードユニットのシーケンスです
- DoubleStringCharacters :: DoubleStringCharacter DoubleStringCharacters のSVは、DoubleStringCharacter のSVである2つまでのコードユニットのシーケンスと、それに続くDoubleStringCharactersのSVのコードユニットです。
- SingleStringCharacters :: SingleStringCharacter のSVは、SingleStringCharacter のSVである最大2つのコードユニットのシーケンスです
- SingleStringCharacters :: SingleStringCharacter SingleStringCharacters のSVは、SingleStringCharacter のSVとそれに続く SingleStringCharacters のSVのコード単位である最大2つのコードユニットのシーケンスです
- DoubleStringCharacter::SourceCharacter " または \ または LineTerminator のSVは、 SourceCharacter のコードポイント値の UTF16Encoding です
- DoubleStringCharacter :: <LS> のSVは、コードユニット 0x2028 (LINE SEPARATOR) です
- DoubleStringCharacter :: <PS> のSVは、コードユニット 0x2029 (PARAGRAPH SEPARATOR) です
- DoubleStringCharacter :: \EscapeSequence のSVは、EscapeSequence のSVです
- DoubleStringCharacter :: LineContinuation のSVは、空のコードユニットのシーケンスです
- SingleStringCharacter :: SourceCharacter ' または \ または LineTerminator のSVは、 SourceCharacter のコードポイント値の UTF16Encoding です
- SingleStringCharacter :: <LS> のSVは、コードユニット 0x2028 (LINE SEPARATOR)です
- SingleStringCharacter :: <PS> のSVは、コードユニット 0x2029 (PARAGRAPH SEPARATOR)です
- SingleStringCharacter :: \EscapeSequence のSVは、EscapeSequence です
- SingleStringCharacter :: LineContinuation のSVは、空のコードユニットのシーケンスです
- EscapeSequence::CharacterEscapeSequence のSVは、CharacterEscapeSequence のSVです
- EscapeSequence :: 0 のSVは、コードユニット 0x0000 (NULL)です
- EscapeSequence :: HexEscapeSequence のSVは、 HexEscapeSequence のSVです
- EscapeSequence :: UnicodeEscapeSequence のSVは、 UnicodeEscapeSequence のSVです
- CharacterEscapeSequence :: SingleEscapeCharacter のSVは、 SingleEscapeCharacter と表34との対応によって値が決定されるコードユニットです
表34: 文字列の単一文字のエスケープシーケンス エスケープシーケンス コードユニット値 Unicodeキャラクター名 シンボル \b 0x0008 BACKSPACE <BS> \t 0x0009 CHARACTER TABULATION <HT> \n 0x000A LINE FEED (LF) <LF> \v 0x000B LINE TABULATION <VT> \f 0x000C FORM FEED (FF) <FF> \r 0x000D CARRIAGE RETURN (CR) <CR> \" 0x0022 QUOTATION MARK " \' 0x0027 APOSTROPHE ' \\ 0x005C REVERSE SOLIDUS \ - CharacterEscapeSequence :: NonEscapeCharacter のSVは、 NonEscapeCharacter のSVです
- NonEscapeCharacter :: SourceCharacter EscapeCharacter または LineTerminator のSVは、SourceCharacter のコードポイント値の UTF16Encoding です
- HexEscapeSequence :: x HexDigit HexDigit のSVは、最初の HexDigit のMVの16倍 + 2番目の HexDigit のコードユニットです
- UnicodeEscapeSequence :: u Hex4Digits のSVは、Hex4Digits のSVです
- Hex4Digits :: HexDigit HexDigit HexDigit HexDigit のSVは、Hex4Digits のMVのコードユニットです
- UnicodeEscapeSequence :: u{ CodePoint } のSVは、CodePoint のMVの UTF16Encoding です
11.8.5 正規表現リテラル(Regular Expression Literals)
以下のプロダクションは、正規表現リテラルの構文の説明です。プロダクションは、正規表現リテラルの終わりを見つけるために使用されます。 次に、RegularExpressionBodyとRegularExpressionFlagsを構成するソーステキストを、より厳密なECMAScript正規表現文法(21.2.1)で再度解析します。
実装は21.2.1で定義されたECMAScript正規表現文法を拡張できますが、以下で定義されたRegularExpressionBodyとRegularExpressionFlagsプロダクション、またはこれらのプロダクションで使用されるプロダクションを拡張してはいけません。
構文:
RegularExpressionNonTerminator * または \ または / または [
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionNonTerminator \ または / または [
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionNonTerminator ] または \
RegularExpressionBackslashSequence
11.8.5.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
- IdentifierPart にUnicodeエスケープシーケンスが含まれている場合は、構文エラーです。
11.8.5.2 静的セマンティクス(Static Semantics):BodyText
- RegularExpressionBody として認識されたソーステキストを返す
11.8.5.3 静的セマンティクス(Static Semantics):FlagText
- RegularExpressionFlags として認識されたソーステキストを返す
11.8.6 テンプレートリテラルレキシカルコンポーネント(Template Literal Lexical Components)
構文:
$[lookahead ≠ {]
\EscapeSequence
\NotEscapeSequence
LineContinuation
LineTerminatorSequence
SourceCharacter ` または \ または $ または LineTerminator
0DecimalDigit
DecimalDigit 0
x[lookahead ∉ HexDigit ]
xHexDigit [lookahead ∉ HexDigit ]
u[lookahead ∉ HexDigit ][lookahead ≠ {]
uHexDigit [lookahead ∉ HexDigit ]
uHexDigit HexDigit [lookahead ∉ HexDigit ]
uHexDigit HexDigit HexDigit [lookahead ∉ HexDigit ]
u{[lookahead ∉ HexDigit ]
u{NotCodePoint [lookahead ∉ HexDigit ]
u{CodePoint [lookahead ∉ HexDigit ][lookahead ≠ }]
準拠実装は、TemplateCharacterの解析で、B.1.2で説明されているEscapeSequenceの拡張定義を使用しないでください。
11.8.6.1 静的セマンティクス:TV と TRV(Static Semantics: TV and TRV)
テンプレートリテラルコンポーネントは、Unicodeコードポイントのシーケンスとして解釈されます。リテラルコンポーネントのテンプレート値(TV)は、さまざまなテンプレートリテラルコンポーネントのパーツからなるコードユニット値(SV:11.8.4)から生成されます。特定のプロセスでは、一部のUnicodeコードポイントは、数学的な値を持つと解釈されます(MV:11.8.3)。TVを決定する際、エスケープシーケンスは、UnicodeコードポイントのUTF-16コードユニットに置き換えられます。 テンプレートRaw値(TRV)はテンプレート値に似ていますが、TRVではエスケープシーケンスが文字どおりに解釈される点が異なります。
- NoSubstitutionTemplate :: `` のTVとTRVは、 空のコードユニットのシーケンスです
- TemplateHead :: `${ のTVとTRVは、 空のコードユニットのシーケンスです
- TemplateMiddle :: }${ のTVとTRVは、 空のコードユニットのシーケンスです
- TemplateTail :: }` のTVとTRVは、 空のコードユニットのシーケンスです
- NoSubstitutionTemplate :: ` TemplateCharacters ` のTVは、TemplateCharacters のTVです
- TemplateHead :: ` TemplateCharacters ${ のTVは、TemplateCharacters のTVです
- TemplateMiddle :: } TemplateCharacters ${ のTVは、 のTVは、TemplateCharacters のTVです
- TemplateTail :: } TemplateCharacters ` のTVは、TemplateCharacters のTVです
- TemplateCharacters :: TemplateCharacter のTVは、 TemplateCharacter のTVです
- TemplateCharacters :: TemplateCharacter TemplateCharacters のTVは、TemplateCharacter または TemplateCharacters のTVが未定義なら、 undefined です。それ以外のとき、TVは TemplateCharacterのTVのコードユニットと、それに続くTemplateCharactersのTVのコードユニットで構成されるシーケンスです。
- TemplateCharacter :: SourceCharacter ` or \ または $ または LineTerminator のTVは、SourceCharacter のコードポイント値の UTF16Encoding です
- TemplateCharacter :: $ のTVは、 コードユニット 0x0024 (DOLLAR SIGN)です
- TemplateCharacter :: \EscapeSequence のTVは、 EscapeSequence のSVです
- TemplateCharacter :: \NotEscapeSequence のTVは、 undefined です
- TemplateCharacter :: LineContinuation のTVは、 LineContinuation のTVです
- TemplateCharacter :: LineTerminatorSequence のTVは、 LineTerminatorSequence のTRVです
- LineContinuation :: \LineTerminatorSequence のTVは、 空のコードユニットのシーケンスです
- NoSubstitutionTemplate :: ` TemplateCharacters ` のTRVは、 TemplateCharacters のTRVです
- TemplateHead :: ` TemplateCharacters ${ のTRVは、 TemplateCharacters のTRVです
- TemplateMiddle :: } TemplateCharacters ${ のTRVは、 TemplateCharacters のTRVです
- TemplateTail :: } TemplateCharacters ` のTRVは、 TemplateCharacters のTRVです
- TemplateCharacters :: TemplateCharacter のTRVは、 TemplateCharacter のTRVです
- TemplateCharacters :: TemplateCharacter TemplateCharacters のTRVは、 TemplateCharacter のTRVのコードユニットと、それに続く TemplateCharacters のTRVのコードユニットで構成されるシーケンスです
- TemplateCharacter :: SourceCharacter ` または \ または $ または LineTerminator のTRVは、SourceCharacter のコードポイント値の UTF16Encoding です
- TemplateCharacter :: $ のTRVは、コードユニット 0x0024 (DOLLAR SIGN)です
- TemplateCharacter :: \ EscapeSequence のTRVは、 コードユニット 0x005C (REVERSE SOLIDUS) と、それに続く EscapeSequence のTRVのコードユニットで構成されるシーケンスです
- TemplateCharacter :: \ NotEscapeSequence のTRVは、 コードユニット 0x005C (REVERSE SOLIDUS) と、それに続く NotEscapeSequence のTRVのコードユニットで構成されるシーケンスです
- TemplateCharacter :: LineContinuation のTRVは、 LineContinuation のTRVです
- TemplateCharacter :: LineTerminatorSequence のTRVは、LineTerminatorSequence のTRVです
- EscapeSequence :: CharacterEscapeSequence のTRVは、 CharacterEscapeSequence のTRVです
- EscapeSequence :: 0 のTRVは、 コードユニット 0x0030 (DIGIT ZERO)です
- EscapeSequence :: HexEscapeSequence のTRVは、HexEscapeSequence のTRVです
- EscapeSequence :: UnicodeEscapeSequence のTRVは、 UnicodeEscapeSequence のTRVです
- NotEscapeSequence :: 0 DecimalDigit のTRVは、 コードユニット 0x0030 (DIGIT ZERO) と、それに続くDecimalDigit のTRVのコードユニットで構成されるシーケンスです
- NotEscapeSequence :: x [lookahead ∉ HexDigit] のTRVは、コードユニット 0x0078 (LATIN SMALL LETTER X)です
- NotEscapeSequence :: x HexDigit [lookahead ∉ HexDigit] のTRVは、コードユニット 0x0078 (LATIN SMALL LETTER X) と、それに続く HexDigit のTRVのコードユニットで構成されるシーケンスです
- NotEscapeSequence :: u [lookahead ∉ HexDigit] [lookahead ≠ {] のTRVは、 コードユニット 0x0075 (LATIN SMALL LETTER U)です
- NotEscapeSequence :: u HexDigit [lookahead ∉ HexDigit] のTRVは、コードユニット 0x0075 (LATIN SMALL LETTER U) と、それに続く HexDigit のTRVのコードユニットで構成されるシーケンスです
- NotEscapeSequence :: u HexDigit HexDigit [lookahead ∉ HexDigit] のTRVは、コードユニット 0x0075 (LATIN SMALL LETTER U) それに続く最初の HexDigit のTRVのコードユニットと、それに続く2番目の HexDigit のTRVのコードユニットで構成されるシーケンスです
- NotEscapeSequence :: u HexDigit HexDigit HexDigit [lookahead ∉ HexDigit] のTRVは、コードユニット 0x0075 (LATIN SMALL LETTER U) それに続く最初の HexDigit のTRVのコードユニットと、それに続く2番目の HexDigit のTRVのコードユニットと、それに続く3番目の HexDigit のTRVのコードユニットで構成されるシーケンスです
- NotEscapeSequence :: u{ [lookahead ∉ HexDigit] のTRVは、コードユニット 0x0075 (LATIN SMALL LETTER U) と、それに続くコードユニット 0x007B (LEFT CURLY BRACKET)で構成されるシーケンスです
- NotEscapeSequence :: u{ NotCodePoint [lookahead ∉ HexDigit] のTRVは、コードユニット 0x0075 (LATIN SMALL LETTER U) と、それに続くコードユニット 0x007B (LEFT CURLY BRACKET)と、それに続く、NotCodePoint のTRVのコードユニットで構成されるシーケンスです
- NotEscapeSequence :: u{ CodePoint [lookahead ∉ HexDigit][lookahead ≠ }] のTRVは、コードユニット 0x0075 (LATIN SMALL LETTER U)と、それに続くコードユニット 0x007B(LEFT CURLY BRACKET) と、それに続く、CodePoint のTRVのコードユニットで構成されるシーケンスです
- DecimalDigit :: どれかひとつ 0 1 2 3 4 5 6 7 8 9 のTRVは、 一致する単一のコードポイントのUTF16Encoding です
- CharacterEscapeSequence :: SingleEscapeCharacter のTRVは、 SingleEscapeCharacter のTRVです
- CharacterEscapeSequence :: NonEscapeCharacter のTRVは、 NonEscapeCharacter のSVです
- SingleEscapeCharacter :: どれかひとつ ' " \ b f n r t v のTRVは、 一致する単一のコードポイントのUTF16Encoding です
- HexEscapeSequence :: x HexDigitHexDigit のTRVは、 コードユニット 0x0078 (LATIN SMALL LETTER X) と、それに続く最初の HexDigit のTRVと、それに続く2番目の HexDigit のTRVのコードユニットで構成されるシーケンスです
- UnicodeEscapeSequence :: u Hex4Digits のTRVは、 コードユニット 0x0075 (LATIN SMALL LETTER U) と、それに続く Hex4Digits のTRVのコードユニットで構成されるシーケンスです
- UnicodeEscapeSequence :: u{ CodePoint } のTRVは、 コードユニット 0x0075 (LATIN SMALL LETTER U) と、それに続くコードユニット 0x007B (LEFT CURLY BRACKET)と、それに続く CodePoint のTRVと、それに続くコードユニット 0x007D (RIGHT CURLY BRACKET)で構成されるシーケンスです
- Hex4Digits :: HexDigit HexDigit HexDigit HexDigit のTRVは、 最初の HexDigit のTRVと、2番目の HexDigit のTRVと、3番目の HexDigit のTRVと、4番目の HexDigit のTRVで構成されるシーケンスです
- HexDigits :: HexDigit のTRVは、 HexDigit のTRVです
- HexDigits ::HexDigits HexDigit のTRVは、 HexDigits のTRVと、それに続く HexDigit のTRVで構成されるシーケンスです
- HexDigit :: どれかひとつ 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F のTRVは、 一致する単一のコードポイントの UTF16Encoding です
- LineContinuation :: \LineTerminatorSequence のTRVは、 コードユニット 0x005C (REVERSE SOLIDUS) と、それに続く LineTerminatorSequence のTRVのコードユニットで構成されるシーケンスです
- LineTerminatorSequence :: <LF> のTRVは、 コードユニット 0x000A (LINE FEED)です
- LineTerminatorSequence :: <CR> のTRVは、 コードユニット 0x000A (LINE FEED)です
- LineTerminatorSequence :: <LS> のTRVは、 コードユニット 0x2028 (LINE SEPARATOR)です
- LineTerminatorSequence :: <PS> のTRVは、 コードユニット 0x2029 (PARAGRAPH SEPARATOR)です
- LineTerminatorSequence :: <CR><LF> のTRVは、コードユニット 0x000A (LINE FEED)で構成されるシーケンスです
11.9 セミコロンの自動挿入(Automatic Semicolon Insertion)
ほとんどのECMAScriptステートメントと宣言は、セミコロンで終了する必要があります。 ただし、便宜上、特定の状況でセミコロンはソーステキストから省略される場合があります。 これらの状況では、セミコロンが自動的にソースコードトークンストリームに挿入されます。
11.9.1 セミコロンの自動挿入のルール(Rules of Automatic Semicolon Insertion)
以下の規則では、「トークン」は、11章で説明されている現在のレキシカルゴールシンボルを使用して決定された、実際に認識された字句トークンを意味します。
セミコロン挿入には3つの基本的ルールがあります。
- ソーステキスト解析中に、プロダクションで許可されていないトークン(問題のトークンとする)が検出され、次の条件に一つ以上該当する場合、問題のトークンの前にセミコロンが挿入されます。
- 問題のトークンの前に、1つ以上のLineTerminatorがある
- 問題のトークンは、} である
- 問題のトークンの前のトークンが ) である。挿入されたセミコロンは、do-whileステートメントの終了セミコロンとして解析される(13.7.2)
- ソーステキスト解析中にトークンの入力ストリームの終わりが検出され、入力トークンストリームをゴール非終端の単一インスタンスとして解析できない場合、入力ストリームの終わりにセミコロンが挿入されます。
- ソーステキスト解析中に検出されたプロダクションが下記の制限されたプロダクションで、トークンがそのプロダクション内の注釈"[no LineTerminator here]"直後のトークンのとき、そのトークンは制限付きトークンと呼ばれます。制限付きトークンが、1つ以上のLineTerminatorによって前のトークンから分離されているとき、制限付きトークンの前にセミコロンが挿入されます。
前述のルールには追加のオーバーライド条件があります。セミコロンが空のステートメントとして解析される場合、またはセミコロンがforステートメントのヘッダー内2つのセミコロンの1つになる場合、セミコロンは自動的に挿入されません(13.7.4を参照)。
LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here]++
LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here]--
continue;
continue[no LineTerminator here]LabelIdentifier[?Yield, ?Await] ;
return;
return[no LineTerminator here]Expression[+In, ?Yield, ?Await] ;
ArrowParameters[?Yield, ?Await] [no LineTerminator here]=>ConciseBody[?In]
yield
yield[no LineTerminator here]AssignmentExpression[?In, +Yield, ?Await]
yield[no LineTerminator here]*AssignmentExpression[?In, +Yield, ?Await]
制限されたプロダクションの実際的な効果:
- 後置演算子++または--トークンが検出され、前のトークンと++または--トークンの間に1つ以上のLineTerminator
がある場合、セミコロンが++または--の前に自動的に挿入されます。 - continue、break、return、throw、yieldトークンが検出され、LineTerminator
が次のトークンの前に検出されると、continue、break、return、throw、yieldトークンの後にセミコロンが自動的に挿入されます。
ECMAScriptプログラマーへの実用的なアドバイス:
- 後置++または--演算子は、そのオペランドと同じ行にある必要があります。
- returnまたはthrowステートメントの式、またはyield式のAssignmentExpressionは、return、throw、またはyieldトークンと同じ行で開始する必要があります。
- breakまたはcontinueステートメントのLabelIdentifierは、breakまたはcontinueトークンと同じ行にある必要があります。
11.9.2 セミコロンの自動挿入の例(Examples of Automatic Semicolon Insertion)
このセクションは非規範的です。
次のソースがあるとします。
{ 1 2 } 3
これは自動セミコロン挿入ルールがあっても、ECMAScript文法では有効な文ではありません。
次のソースがあるとします。
{ 1
2 } 3
これも有効なECMAScript文ではありませんが、セミコロンの自動挿入によって次のように変換されます。
{ 1
;2 ;} 3;
これは有効なECMAScript文です。
次のソースがあるとします。
for (a; b
)
これは有効なECMAScript文でありません。forステートメントのヘッダーにセミコロンが必要なため、セミコロンの自動挿入によって変更されません。 セミコロンの自動挿入では、forステートメントのヘッダーに2つのセミコロンのいずれかが挿入されることはありません。
次のソースがあるとします。
return
a + b
これはセミコロンの自動挿入によって次のように変換されます。
return;
a + b;
次のソースがあるとします。
a = b
++c
これはセミコロンの自動挿入によって次のように変換されます。
a = b;
++c;
次のソースがあるとします。
if (a > b)
else c = d
これは有効なECMAScript文ではありません。elseトークンの前はセミコロンの自動挿入によって変更されません。ただし、自動挿入されたセミコロンは空のステートメントとして解析されるため、その時点では文法のプロダクションは適用されません。
次のソースがあるとします。
a = b + c
(d + e).print()
このソースは、2行目の括弧を一行目のcという関数の引数リストとして解釈できるため、セミコロンが自動挿入されません。
a = b + c(d + e).print()
代入ステートメントが左括弧で始まる必要がある状況では、自動セミコロンの挿入に依存するよりも、プログラマーが前のステートメントの終わりに明示的なセミコロンを提供することをお勧めします。
11.10 自動セミコロン挿入の興味深いケース(Interesting Cases of Automatic Semicolon Insertion)
このセクションは非規範的です。
ECMAScriptプログラムは、セミコロンの自動挿入により、セミコロンがほとんどないスタイルで記述できます。 上記のように、セミコロンはすべての改行に挿入されるわけではありません。セミコロンの自動挿入は、行の終了記号にまたがる複数のトークンに依存する可能性があります。
ECMAScriptに新しい構文機能が追加されると、文法プロダクションが増えます。結果として、正しく解釈されていたソーステキストが、文法追加により正しく解釈されない可能性があります。
セミコロンの自動挿入は、先行するソーステキストに応じて、セミコロンが挿入される場合と挿入されない場合があります。 このセクションの残りの部分では、ECMAScriptのこのバージョンでのセミコロンの自動挿入の興味深いケースについて説明します。
11.10.1 ステートメントリストでのセミコロンの自動挿入の興味深いケース(Interesting Cases of Automatic Semicolon Insertion in Statement Lists)
StatementListは、多くのStatementListItem
がセミコロンで終了します。ただし、セミコロンの自動挿入を使用して省略できます。 上記のルールの結果として、式を終了する行の終わりで、次の行が次のいずれかで始まる場合はセミコロンが必要です。
- 左括弧 "(" 。セミコロンがない場合、2つの行はCallExpressionとして扱われます。
- 開き角括弧 "[" 。 セミコロンがない場合、2つの行は、プロパティアクセスとして扱われます。ArrayLiteralまたはArrayAssignmentPatternではありません。
- テンプレートリテラル "`"。 セミコロンがない場合、2つの行はタグ付きテンプレート(12.3.11)として、前の式はMemberExpressionとして解釈されます。
- 単項+または-。 セミコロンがない場合、2つの行は、2項演算子を使用しているとして解釈されます。
- RegExpリテラル。 セミコロンがない場合、たとえば、RegExpにフラグがある場合、2つの行が一緒に/MultiplicativeOperatorとして解析されることがあります。
11.11 セミコロン自動挿入の事例と"[no LineTerminator here]"(Cases of Automatic Semicolon Insertion and “[no LineTerminator here]”)
このセクションは非規範的です。
ECMAScriptには、"[no LineTerminator here]" を含んでいる文法プロダクションがあります。 これらのプロダクションは、オプションのオペランドを持つ場合があります。 これらの場所にLineTerminatorを導入すると、オプションのオペランドなしで文法プロダクションを使用することにより、ソーステキストの文法生成が変更されます。
このセクションの残りの部分では、このバージョンのECMAScriptで"[no LineTerminator here]"を使用する多くのプロダクションについて説明します。
複数のレキシカルゴールを使用すると、セミコロンの自動挿入に影響するあいまいさがなくなります。 たとえば、先頭のディビジョンまたはディビジョン割り当て、および先頭のRegularExpressionLiteralの両方が許可されている構文文法コンテキストはありません。 これはセミコロン挿入の影響を受けません(11.9を参照)。例:
LineTerminatorの後の最初の非空白、非コメントコードポイントがU+002F(SOLIDUS)であり、構文コンテキストで除算または除算割り当てが許可されている場合、LineTerminatorにセミコロンは挿入されません。 つまり、上記の例は次のように解釈されます。