ページ表示設定

12 ECMAScript 言語: 字句文法

ECMAScript Script または Module のソーステキストは、最初に、トークン、行終端文字、コメント、または空白である入力要素の列に変換されます。ソーステキストは左から右へ走査され、可能な限り最長のコードポイント列を次の入力要素として繰り返し取得します。

字句入力要素の識別が、その入力要素を消費する構文文法の文脈に依存する状況がいくつかあります。このため、字句文法には複数の目標記号が必要です。InputElementHashbangOrRegExp 目標は Script または Module の先頭で使用されます。InputElementRegExpOrTemplateTail 目標は、RegularExpressionLiteral、TemplateMiddle、または TemplateTail が許可される構文文法の文脈で使用されます。InputElementRegExp 目標記号は、RegularExpressionLiteral は許可されるものの、TemplateMiddle と TemplateTail のいずれも許可されないすべての構文文法の文脈で使用されます。InputElementTemplateTail 目標は、TemplateMiddle または TemplateTail は許可されるものの、RegularExpressionLiteral は許可されないすべての構文文法の文脈で使用されます。それ以外のすべての文脈では、InputElementDiv が字句目標記号として使用されます。

注

複数の字句目標を使用することで、セミコロン自動挿入に影響する字句上の曖昧さが存在しないことが保証されます。たとえば、先頭の除算または除算代入と、先頭の RegularExpressionLiteral の両方が許可される構文文法の文脈はありません。これはセミコロン挿入(12.10 を参照)の影響を受けません。次のような例では:

a = b
/hi/g.exec(c).map(d);

LineTerminator の後にある最初の空白でもコメントでもないコードポイントが U+002F (SOLIDUS) であり、構文上の文脈で除算または除算代入が許可される場合、LineTerminator の位置にセミコロンは挿入されません。つまり、上の例は次と同じように解釈されます。

a = b / hi / g.exec(c).map(d);

構文

InputElementDiv :: WhiteSpace LineTerminator Comment CommonToken DivPunctuator RightBracePunctuator InputElementRegExp :: WhiteSpace LineTerminator Comment CommonToken RightBracePunctuator RegularExpressionLiteral InputElementRegExpOrTemplateTail :: WhiteSpace LineTerminator Comment CommonToken RegularExpressionLiteral TemplateSubstitutionTail InputElementTemplateTail :: WhiteSpace LineTerminator Comment CommonToken DivPunctuator TemplateSubstitutionTail InputElementHashbangOrRegExp :: WhiteSpace LineTerminator Comment CommonToken HashbangComment RegularExpressionLiteral

12.1 Unicode 書式制御文字

Unicode 書式制御文字(すなわち、LEFT-TO-RIGHT MARK や RIGHT-TO-LEFT MARK など、Unicode Character Database のカテゴリ「Cf」に属する文字)は、マークアップ言語などの上位レベルのプロトコルが存在しない場合に、一定範囲のテキストの書式を制御するために使用される制御コードです。

編集と表示を容易にするため、ソーステキスト内で書式制御文字を許可することは有用です。すべての書式制御文字は、コメント内、および文字列リテラル、テンプレートリテラル、正規表現リテラル内で使用できます。

U+FEFF (ZERO WIDTH NO-BREAK SPACE) は、主にテキストの先頭で、そのテキストが Unicode であることを示し、テキストの符号化方式およびバイト順を検出できるようにするために使用される書式制御文字です。この目的のための <ZWNBSP> 文字が、たとえばファイルの連結の結果として、テキストの先頭より後に現れる場合もあります。ECMAScript ソーステキストでは、コメント、文字列リテラル、テンプレートリテラル、および正規表現リテラルの外側にある <ZWNBSP> コードポイントは空白文字として扱われます(12.2 を参照)。

12.2 空白

空白コードポイントは、ソーステキストの可読性を向上させ、トークン(分割不可能な字句単位)を互いに分離するために使用されますが、それ以外の意味はありません。空白コードポイントは任意の2つのトークンの間、および入力の先頭または末尾に現れることができます。空白コードポイントは StringLiteral、RegularExpressionLiteral、Template、または TemplateSubstitutionTail 内にも現れることができ、その場合はリテラル値の一部を形成する意味のあるコードポイントとみなされます。また Comment 内にも現れることができますが、それ以外の種類のトークン内には現れることができません。

ECMAScript の空白コードポイントを 表 31 に示します。

表 31: 空白コードポイント
コードポイント 名前 略称
U+0009 CHARACTER TABULATION <TAB>
U+000B LINE TABULATION <VT>
U+000C FORM FEED (FF) <FF>
U+FEFF ZERO WIDTH NO-BREAK SPACE <ZWNBSP>
一般カテゴリ「Space_Separator」に属する任意のコードポイント <USP>
注 1

U+0020 (SPACE) および U+00A0 (NO-BREAK SPACE) のコードポイントは <USP> の一部です。

注 2

表 31 に列挙されるコードポイントを除き、ECMAScript の WhiteSpace は、Unicode の「White_Space」プロパティを持つものの、一般カテゴリ「Space_Separator」(「Zs」)に分類されないすべてのコードポイントを意図的に除外しています。

構文

WhiteSpace :: <TAB> <VT> <FF> <ZWNBSP> <USP>

12.3 行終端文字

空白コードポイントと同様に、行終端コードポイントはソーステキストの可読性を向上させ、トークン(分割不可能な字句単位)を互いに分離するために使用されます。ただし、空白コードポイントとは異なり、行終端文字は構文文法の動作にある程度影響します。一般に、行終端文字は任意の2つのトークンの間に現れることができますが、構文文法によって禁止される箇所がいくつかあります。行終端文字はセミコロン自動挿入(12.10)の処理にも影響します。行終端文字は、StringLiteral、Template、または TemplateSubstitutionTail を除くいかなるトークン内にも現れることができません。<LF> および <CR> 行終端文字は、LineContinuation の一部である場合を除き、StringLiteral トークン内に現れることができません。

行終端文字は MultiLineComment 内に現れることができますが、SingleLineComment 内には現れることができません。

行終端文字は、正規表現の \s クラスに一致する空白コードポイントの集合に含まれます。

ECMAScript の行終端コードポイントを 表 32 に示します。

表 32: 行終端コードポイント
コードポイント Unicode 名 略称
U+000A LINE FEED (LF) <LF>
U+000D CARRIAGE RETURN (CR) <CR>
U+2028 LINE SEPARATOR <LS>
U+2029 PARAGRAPH SEPARATOR <PS>

表 32 にある Unicode コードポイントだけが行終端文字として扱われます。その他の改行または行分割の Unicode コードポイントは行終端文字として扱われませんが、表 31 に列挙される要件を満たす場合は空白として扱われます。

構文

LineTerminator :: <LF> <CR> <LS> <PS> LineTerminatorSequence :: <LF> <CR> [lookahead ≠ <LF>] <LS> <PS> <CR> <LF> 注

生成規則 LineTerminatorSequence :: <CR> <LF> は、診断で行番号を報告する場合などに、全体として単一の行終端文字として動作するべきコードポイント列に一致します。

12.4 コメント

コメントには単一行コメントと複数行コメントがあります。複数行コメントを入れ子にすることはできません。

単一行コメントには LineTerminator コードポイントを除く任意の Unicode コードポイントを含めることができ、またトークンは常に可能な限り長くなるという一般規則があるため、単一行コメントは常に // マーカーから行末までのすべてのコードポイントで構成されます。ただし、行末の LineTerminator は単一行コメントの一部とはみなされません。これは字句文法によって個別に認識され、構文文法の入力要素ストリームの一部になります。この点は非常に重要です。これは、単一行コメントの有無がセミコロン自動挿入の処理に影響しないことを意味するためです(12.10 を参照)。

コメントは空白のように動作し、破棄されます。ただし、MultiLineComment が行終端コードポイントを含む場合、構文文法による構文解析の目的では、コメント全体が LineTerminator とみなされます。

構文

Comment :: MultiLineComment SingleLineComment MultiLineComment :: /* MultiLineCommentCharsopt */ MultiLineCommentChars :: MultiLineNotAsteriskChar MultiLineCommentCharsopt * PostAsteriskCommentCharsopt PostAsteriskCommentChars :: MultiLineNotForwardSlashOrAsteriskChar MultiLineCommentCharsopt * PostAsteriskCommentCharsopt MultiLineNotAsteriskChar :: SourceCharacter but not * MultiLineNotForwardSlashOrAsteriskChar :: SourceCharacter but not one of / or * SingleLineComment :: // SingleLineCommentCharsopt SingleLineCommentChars :: SingleLineCommentChar SingleLineCommentCharsopt SingleLineCommentChar :: SourceCharacter but not LineTerminator

この節のいくつかの生成規則には、B.1.1 節で別の定義が与えられています。

12.5 Hashbang コメント

Hashbang コメントは位置依存であり、他の種類のコメントと同様に、構文文法の入力要素ストリームから破棄されます。

構文

HashbangComment :: #! SingleLineCommentCharsopt

12.6 トークン

構文

CommonToken :: IdentifierName PrivateIdentifier Punctuator NumericLiteral StringLiteral Template 注

DivPunctuator、RegularExpressionLiteral、RightBracePunctuator、および TemplateSubstitutionTail の生成規則は、CommonToken の生成規則に含まれていない追加のトークンを導出します。

12.7 名前とキーワード

IdentifierName および ReservedWord は、Unicode Standard Annex #31「Identifier and Pattern Syntax」で規定される Default Identifier Syntax に、いくつかの小さな変更を加えて解釈されるトークンです。ReservedWord は IdentifierName の列挙された部分集合です。構文文法では、Identifier を ReservedWord ではない IdentifierName として定義します。Unicode 識別子文法は、Unicode Standard で規定される文字プロパティに基づいています。Unicode Standard の最新バージョンで指定されたカテゴリに属する Unicode コードポイントは、すべての適合する ECMAScript 実装によってそのカテゴリに属するものとして扱われなければなりません。ECMAScript 実装は、Unicode Standard の後の版で定義された識別子コードポイントを認識してもかまいません。

注 1

この標準では、特定のコードポイントの追加を規定しています。U+0024 (DOLLAR SIGN) および U+005F (LOW LINE) は、IdentifierName 内の任意の位置で許可されます。

構文

PrivateIdentifier :: # IdentifierName IdentifierName :: IdentifierStart IdentifierName IdentifierPart IdentifierStart :: IdentifierStartChar \ UnicodeEscapeSequence IdentifierPart :: IdentifierPartChar \ UnicodeEscapeSequence IdentifierStartChar :: UnicodeIDStart $ _ IdentifierPartChar :: UnicodeIDContinue $ AsciiLetter :: one of a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z UnicodeIDStart :: any Unicode code point with the Unicode property “ID_Start” UnicodeIDContinue :: any Unicode code point with the Unicode property “ID_Continue”

非終端記号 UnicodeEscapeSequence の定義は 12.9.4 に示されています。

注 2

非終端記号 IdentifierPart は UnicodeIDContinue を介して _ を導出します。

注 3

Unicode プロパティ「ID_Start」および「ID_Continue」を持つコードポイントの集合には、それぞれ Unicode プロパティ「Other_ID_Start」および「Other_ID_Continue」を持つコードポイントが含まれます。

12.7.1 識別子名

Unicode エスケープシーケンスは IdentifierName 内で許可され、その場合、UnicodeEscapeSequence の IdentifierCodePoint に等しい1つの Unicode コードポイントとして寄与します。UnicodeEscapeSequence に先行する \ は、いかなるコードポイントにも寄与しません。UnicodeEscapeSequence を、そうでなければ無効になるコードポイントを IdentifierName に含めるために使用することはできません。言い換えると、`` |UnicodeEscapeSequence| の列を、それが寄与する |SourceCharacter| に置き換えた場合でも、結果は元の |IdentifierName| とまったく同じ |SourceCharacter| 要素の列を持つ有効な |IdentifierName| でなければなりません。この仕様における |IdentifierName| のすべての解釈は、特定のコードポイントを寄与させるためにエスケープシーケンスが使用されたかどうかにかかわらず、その実際のコードポイントに基づきます。

Unicode Standard に従って正準的に等価な2つの IdentifierName であっても、各 UnicodeEscapeSequence を置換した後にまったく同じコードポイント列で表現されない限り、等しくありません。

12.7.1.1 Static Semantics: 早期エラー

IdentifierStart :: \ UnicodeEscapeSequence IdentifierPart :: \ UnicodeEscapeSequence

12.7.1.2 Static Semantics: IdentifierCodePoints

構文指向操作 IdentifierCodePoints。引数なし。戻り値:リスト (要素:コードポイント)。 次の生成規則ごとに定義される。

IdentifierName :: IdentifierStart
  1. codePoint を IdentifierStart の IdentifierCodePoint とする。
  2. « codePoint » を返す。
IdentifierName :: IdentifierName IdentifierPart
  1. codePoints を派生した IdentifierName の IdentifierCodePoints とする。
  2. codePoint を IdentifierPart の IdentifierCodePoint とする。
  3. codePoints と « codePoint » のリスト連結を返す。

12.7.1.3 Static Semantics: IdentifierCodePoint

構文指向操作 IdentifierCodePoint。引数なし。戻り値:コードポイント。 次の生成規則ごとに定義される。

IdentifierStart :: IdentifierStartChar
  1. IdentifierStartChar に一致するコードポイントを返す。
IdentifierPart :: IdentifierPartChar
  1. IdentifierPartChar に一致するコードポイントを返す。
UnicodeEscapeSequence :: u Hex4Digits
  1. 数値が Hex4Digits の MV であるコードポイントを返す。
UnicodeEscapeSequence :: u{ CodePoint }
  1. 数値が CodePoint の MV であるコードポイントを返す。

12.7.2 キーワードと予約語

キーワードとは、IdentifierName に一致する一方で、構文上の用途も持つトークンです。つまり、何らかの構文生成規則に fixed width フォントで文字どおりに現れます。ECMAScript のキーワードには、if、while、async、await など多数あります。

予約語とは、識別子として使用できない IdentifierName です。多くのキーワードは予約語ですが、一部は予約語ではなく、一部は特定の文脈でのみ予約されます。if と while は予約語です。await は async 関数とモジュールの内部でのみ予約されます。async は予約されておらず、制限なく変数名または文ラベルとして使用できます。

この仕様では、文法生成規則と早期エラー規則を組み合わせて、どの名前が有効な識別子であり、どの名前が予約語であるかを規定します。以下の ReservedWord リスト内のすべてのトークンは、await と yield を除き、無条件に予約されています。await および yield の例外は、パラメーター化された構文生成規則を使用して 13.1 で規定されています。最後に、いくつかの早期エラー規則が有効な識別子の集合を制限します。13.1.1、14.3.1.1、14.7.5.1、および 15.7.1 を参照してください。まとめると、識別子名には5つのカテゴリがあります。

  • Math、window、toString、_ など、常に識別子として許可され、キーワードではないもの。

  • 決して識別子として許可されないもの。すなわち、以下に列挙される ReservedWord のうち await と yield を除くもの。

  • 文脈に応じて識別子として許可されるもの。すなわち await と yield。

  • strict モードコードにおいて、文脈に応じて識別子として禁止されるもの。let、static、implements、interface、package、private、protected、および public。

  • 常に識別子として許可される一方で、Identifier が許可されない箇所において特定の構文生成規則内ではキーワードとしても現れるもの。as、async、from、get、meta、of、set、および target。

条件付きキーワード、または 文脈依存キーワードという用語は、最後の3つのカテゴリに属し、一部の文脈では識別子として、その他の文脈ではキーワードとして使用できるキーワードを指すために使用されることがあります。

構文

ReservedWord :: one of await break case catch class const continue debugger default delete do else enum export extends false finally for function if import in instanceof new null return super switch this throw true try typeof var void while with yield 注 1

5.1.5 に従い、文法内のキーワードは特定の SourceCharacter 要素のリテラル列に一致します。キーワード内のコードポイントを \ UnicodeEscapeSequence で表すことはできません。

IdentifierName は \ UnicodeEscapeSequence を含むことができますが、els\u{65} と記述して「else」という名前の変数を宣言することはできません。13.1.1 の早期エラー規則は、予約語と同じ StringValue を持つ識別子を排除します。

注 2

enum は現在、この仕様ではキーワードとして使用されていません。これは将来の予約語であり、将来の言語拡張でキーワードとして使用するために予約されています。

同様に、implements、interface、package、private、protected、および public は、strict モードコードにおける将来の予約語です。

注 3

arguments および eval という名前はキーワードではありませんが、strict モードコードではいくつかの制限を受けます。13.1.1、8.6.4、15.2.1、15.5.1、15.6.1、および 15.8.1 を参照してください。

12.8 区切り子

構文

Punctuator :: OptionalChainingPunctuator OtherPunctuator OptionalChainingPunctuator :: ?. [lookahead ∉ DecimalDigit] OtherPunctuator :: one of { ( ) [ ] . ... ; , < > <= >= == != === !== + - * % ** ++ -- << >> >>> & | ^ ! ~ && || ?? ? : = += -= *= %= **= <<= >>= >>>= &= |= ^= &&= ||= ??= => DivPunctuator :: / /= RightBracePunctuator :: }

12.9 リテラル

12.9.1 Null リテラル

構文

NullLiteral :: null

12.9.2 Boolean リテラル

構文

BooleanLiteral :: true false

12.9.3 数値リテラル

構文

NumericLiteralSeparator :: _ NumericLiteral :: DecimalLiteral DecimalBigIntegerLiteral NonDecimalIntegerLiteral[+Sep] NonDecimalIntegerLiteral[+Sep] BigIntLiteralSuffix LegacyOctalIntegerLiteral DecimalBigIntegerLiteral :: 0 BigIntLiteralSuffix NonZeroDigit DecimalDigits[+Sep]opt BigIntLiteralSuffix NonZeroDigit NumericLiteralSeparator DecimalDigits[+Sep] BigIntLiteralSuffix NonDecimalIntegerLiteral[Sep] :: BinaryIntegerLiteral[?Sep] OctalIntegerLiteral[?Sep] HexIntegerLiteral[?Sep] BigIntLiteralSuffix :: n DecimalLiteral :: DecimalIntegerLiteral . DecimalDigits[+Sep]opt ExponentPart[+Sep]opt . DecimalDigits[+Sep] ExponentPart[+Sep]opt DecimalIntegerLiteral ExponentPart[+Sep]opt DecimalIntegerLiteral :: 0 NonZeroDigit NonZeroDigit NumericLiteralSeparatoropt DecimalDigits[+Sep] NonOctalDecimalIntegerLiteral DecimalDigits[Sep] :: DecimalDigit DecimalDigits[?Sep] DecimalDigit [+Sep] DecimalDigits[+Sep] NumericLiteralSeparator DecimalDigit DecimalDigit :: one of 0 1 2 3 4 5 6 7 8 9 NonZeroDigit :: one of 1 2 3 4 5 6 7 8 9 ExponentPart[Sep] :: ExponentIndicator SignedInteger[?Sep] ExponentIndicator :: one of e E SignedInteger[Sep] :: DecimalDigits[?Sep] + DecimalDigits[?Sep] - DecimalDigits[?Sep] BinaryIntegerLiteral[Sep] :: 0b BinaryDigits[?Sep] 0B BinaryDigits[?Sep] BinaryDigits[Sep] :: BinaryDigit BinaryDigits[?Sep] BinaryDigit [+Sep] BinaryDigits[+Sep] NumericLiteralSeparator BinaryDigit BinaryDigit :: one of 0 1 OctalIntegerLiteral[Sep] :: 0o OctalDigits[?Sep] 0O OctalDigits[?Sep] OctalDigits[Sep] :: OctalDigit OctalDigits[?Sep] OctalDigit [+Sep] OctalDigits[+Sep] NumericLiteralSeparator OctalDigit LegacyOctalIntegerLiteral :: 0 OctalDigit LegacyOctalIntegerLiteral OctalDigit NonOctalDecimalIntegerLiteral :: 0 NonOctalDigit LegacyOctalLikeDecimalIntegerLiteral NonOctalDigit NonOctalDecimalIntegerLiteral DecimalDigit LegacyOctalLikeDecimalIntegerLiteral :: 0 OctalDigit LegacyOctalLikeDecimalIntegerLiteral OctalDigit OctalDigit :: one of 0 1 2 3 4 5 6 7 NonOctalDigit :: one of 8 9 HexIntegerLiteral[Sep] :: 0x HexDigits[?Sep] 0X HexDigits[?Sep] HexDigits[Sep] :: HexDigit HexDigits[?Sep] HexDigit [+Sep] HexDigits[+Sep] NumericLiteralSeparator HexDigit HexDigit :: one of 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

NumericLiteral の直後の SourceCharacter は IdentifierStart または DecimalDigit であってはなりません。

注

たとえば、3in はエラーであり、2つの入力要素 3 と in ではありません。

12.9.3.1 Static Semantics: 早期エラー

NumericLiteral :: LegacyOctalIntegerLiteral DecimalIntegerLiteral :: NonOctalDecimalIntegerLiteral
  • IsStrict(this production) が true である場合、Syntax Error です。
注
非 strict コードでは、この構文はレガシーです。

12.9.3.2 Static Semantics: MV

数値リテラルは Number 型または BigInt 型の値を表します。

12.9.3.3 Static Semantics: NumericValue

構文指向操作 NumericValue。引数なし。戻り値:(Number または BigInt)。 次の生成規則ごとに定義される。

NumericLiteral :: DecimalLiteral
  1. RoundMVResult(DecimalLiteral の MV) を返す。
NumericLiteral :: NonDecimalIntegerLiteral
  1. 𝔽(NonDecimalIntegerLiteral の MV) を返す。
NumericLiteral :: LegacyOctalIntegerLiteral
  1. 𝔽(LegacyOctalIntegerLiteral の MV) を返す。
NumericLiteral :: NonDecimalIntegerLiteral BigIntLiteralSuffix
  1. NonDecimalIntegerLiteral の MV に対応する BigInt 値を返す。
DecimalBigIntegerLiteral :: 0 BigIntLiteralSuffix
  1. 0ℤ を返す。
DecimalBigIntegerLiteral :: NonZeroDigit BigIntLiteralSuffix
  1. NonZeroDigit の MV に対応する BigInt 値を返す。
DecimalBigIntegerLiteral :: NonZeroDigit DecimalDigits BigIntLiteralSuffix NonZeroDigit NumericLiteralSeparator DecimalDigits BigIntLiteralSuffix
  1. n を、NumericLiteralSeparator のすべての出現を除いた DecimalDigits 内のコードポイント数とする。
  2. mv を(NonZeroDigit の MV × 10n)に DecimalDigits の MV を加えた値とする。
  3. ℤ(mv) を返す。

12.9.4 文字列リテラル

注 1

文字列リテラルは、単一引用符または二重引用符で囲まれた0個以上の Unicode コードポイントです。Unicode コードポイントはエスケープシーケンスによって表すこともできます。終了引用符のコードポイント、U+005C (REVERSE SOLIDUS)、U+000D (CARRIAGE RETURN)、および U+000A (LINE FEED) を除き、すべてのコードポイントを文字列リテラル内に文字どおりに現すことができます。任意のコードポイントをエスケープシーケンスの形式で現すことができます。文字列リテラルは ECMAScript String 値に評価されます。これらの String 値を生成するとき、Unicode コードポイントは 11.1.1 で定義されるとおり UTF-16 で符号化されます。基本多言語面に属するコードポイントは、String の単一のコード単位要素として符号化されます。それ以外のすべてのコードポイントは、String の2つのコード単位要素として符号化されます。

構文

StringLiteral :: " DoubleStringCharactersopt " ' SingleStringCharactersopt ' DoubleStringCharacters :: DoubleStringCharacter DoubleStringCharactersopt SingleStringCharacters :: SingleStringCharacter SingleStringCharactersopt DoubleStringCharacter :: SourceCharacter but not one of " or \ or LineTerminator <LS> <PS> \ EscapeSequence LineContinuation SingleStringCharacter :: SourceCharacter but not one of ' or \ or LineTerminator <LS> <PS> \ EscapeSequence LineContinuation LineContinuation :: \ LineTerminatorSequence EscapeSequence :: CharacterEscapeSequence 0 [lookahead ∉ DecimalDigit] LegacyOctalEscapeSequence NonOctalDecimalEscapeSequence HexEscapeSequence UnicodeEscapeSequence CharacterEscapeSequence :: SingleEscapeCharacter NonEscapeCharacter SingleEscapeCharacter :: one of ' " \ b f n r t v NonEscapeCharacter :: SourceCharacter but not one of EscapeCharacter or LineTerminator EscapeCharacter :: SingleEscapeCharacter DecimalDigit x u LegacyOctalEscapeSequence :: 0 [lookahead ∈ { 8, 9 }] NonZeroOctalDigit [lookahead ∉ OctalDigit] ZeroToThree OctalDigit [lookahead ∉ OctalDigit] FourToSeven OctalDigit ZeroToThree OctalDigit OctalDigit NonZeroOctalDigit :: OctalDigit but not 0 ZeroToThree :: one of 0 1 2 3 FourToSeven :: one of 4 5 6 7 NonOctalDecimalEscapeSequence :: one of 8 9 HexEscapeSequence :: x HexDigit HexDigit UnicodeEscapeSequence :: u Hex4Digits u{ CodePoint } Hex4Digits :: HexDigit HexDigit HexDigit HexDigit

非終端記号 HexDigit の定義は 12.9.3 に示されています。SourceCharacter は 11.1 で定義されています。

注 2

<LF> および <CR> は、空のコードポイント列を生成する LineContinuation の一部である場合を除き、文字列リテラル内に現れることができません。文字列リテラルの String 値にこれらのいずれかを含める正しい方法は、\n や \u000A などのエスケープシーケンスを使用することです。

12.9.4.1 Static Semantics: 早期エラー

EscapeSequence :: LegacyOctalEscapeSequence NonOctalDecimalEscapeSequence
  • IsStrict(this production) が true である場合、Syntax Error です。
注 1
非 strict コードでは、この構文はレガシーです。
注 2

文字列リテラルが、包含コードを strict モードにする Use Strict ディレクティブより前に現れることがあり、実装はそのようなリテラルについて上記の規則を適用するよう注意しなければなりません。たとえば、次のソーステキストには Syntax Error が含まれます。

function invalid() { "\7"; "use strict"; }

12.9.4.2 Static Semantics: SV

構文指向操作 SV。引数なし。戻り値:String。

文字列リテラルは String 型の値を表します。SV は、文字列リテラルのさまざまな部分に再帰的に適用することによって、文字列リテラルの String 値を生成します。この処理の一部として、文字列リテラル内の一部の Unicode コードポイントは、以下または 12.9.3 で説明されるように、数学的な値を持つものとして解釈されます。

表 33: 文字列の単一文字エスケープシーケンス
エスケープシーケンス コード単位値 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 \

12.9.4.3 Static Semantics: MV

12.9.5 正規表現リテラル

注 1

正規表現リテラルは、そのリテラルが評価されるたびに RegExp オブジェクト(22.2 を参照)へ変換される入力要素です。プログラム内の2つの正規表現リテラルは、2つのリテラルの内容が同一であっても、互いに === と比較して等しくなることのない正規表現オブジェクトへ評価されます。RegExp オブジェクトは、実行時に new RegExp または RegExp コンストラクターを関数として呼び出すことによって作成することもできます(22.2.4 を参照)。

以下の生成規則は正規表現リテラルの構文を説明し、入力要素スキャナーによって正規表現リテラルの終端を見つけるために使用されます。RegularExpressionBody および RegularExpressionFlags を構成するソーステキストは、その後、より厳密な ECMAScript 正規表現文法(22.2.1)を使用して再度構文解析されます。

実装は 22.2.1 で定義される ECMAScript 正規表現文法を拡張してもかまいませんが、以下で定義される RegularExpressionBody および RegularExpressionFlags の生成規則、またはこれらの生成規則によって使用される生成規則を拡張してはなりません。

構文

RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags RegularExpressionBody :: RegularExpressionFirstChar RegularExpressionChars RegularExpressionChars :: [empty] RegularExpressionChars RegularExpressionChar RegularExpressionFirstChar :: RegularExpressionNonTerminator but not one of * or \ or / or [ RegularExpressionBackslashSequence RegularExpressionClass RegularExpressionChar :: RegularExpressionNonTerminator but not one of \ or / or [ RegularExpressionBackslashSequence RegularExpressionClass RegularExpressionBackslashSequence :: \ RegularExpressionNonTerminator RegularExpressionNonTerminator :: SourceCharacter but not LineTerminator RegularExpressionClass :: [ RegularExpressionClassChars ] RegularExpressionClassChars :: [empty] RegularExpressionClassChars RegularExpressionClassChar RegularExpressionClassChar :: RegularExpressionNonTerminator but not one of ] or \ RegularExpressionBackslashSequence RegularExpressionFlags :: [empty] RegularExpressionFlags IdentifierPartChar 注 2

正規表現リテラルを空にすることはできません。空の正規表現リテラルを表す代わりに、コード単位列 // は単一行コメントを開始します。空の正規表現を指定するには /(?:)/ を使用してください。

12.9.5.1 Static Semantics: BodyText

構文指向操作 BodyText。引数なし。戻り値:ソーステキスト。 次の生成規則ごとに定義される。

RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags
  1. RegularExpressionBody として認識されたソーステキストを返す。

12.9.5.2 Static Semantics: FlagText

構文指向操作 FlagText。引数なし。戻り値:ソーステキスト。 次の生成規則ごとに定義される。

RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags
  1. RegularExpressionFlags として認識されたソーステキストを返す。

12.9.6 テンプレートリテラルの字句構成要素

構文

Template :: NoSubstitutionTemplate TemplateHead NoSubstitutionTemplate :: ` TemplateCharactersopt ` TemplateHead :: ` TemplateCharactersopt ${ TemplateSubstitutionTail :: TemplateMiddle TemplateTail TemplateMiddle :: } TemplateCharactersopt ${ TemplateTail :: } TemplateCharactersopt ` TemplateCharacters :: TemplateCharacter TemplateCharactersopt TemplateCharacter :: $ [lookahead ≠ {] \ TemplateEscapeSequence \ NotEscapeSequence LineContinuation LineTerminatorSequence SourceCharacter but not one of ` or \ or $ or LineTerminator TemplateEscapeSequence :: CharacterEscapeSequence 0 [lookahead ∉ DecimalDigit] HexEscapeSequence UnicodeEscapeSequence NotEscapeSequence :: 0 DecimalDigit DecimalDigit but not 0 x [lookahead ∉ HexDigit] x HexDigit [lookahead ∉ HexDigit] u [lookahead ∉ HexDigit] [lookahead ≠ {] u HexDigit [lookahead ∉ HexDigit] u HexDigit HexDigit [lookahead ∉ HexDigit] u HexDigit HexDigit HexDigit [lookahead ∉ HexDigit] u { [lookahead ∉ HexDigit] u { NotCodePoint [lookahead ∉ HexDigit] u { CodePoint [lookahead ∉ HexDigit] [lookahead ≠ }] NotCodePoint :: HexDigits[~Sep] but only if the MV of HexDigits > 0x10FFFF CodePoint :: HexDigits[~Sep] but only if the MV of HexDigits ≤ 0x10FFFF 注

TemplateSubstitutionTail は InputElementTemplateTail の代替字句目標で使用されます。

12.9.6.1 Static Semantics: TV

構文指向操作 TV。引数なし。戻り値:(String または undefined)。 テンプレートリテラルの構成要素は、TV によって String 型の値として解釈されます。TV は、テンプレートオブジェクトのインデックス付き構成要素(口語的にはテンプレート値)を構築するために使用されます。TV では、エスケープシーケンスは、そのエスケープシーケンスが表す Unicode コードポイントの UTF-16 コード単位に置換されます。

12.9.6.2 Static Semantics: TRV

構文指向操作 TRV。引数なし。戻り値:String。 テンプレートリテラルの構成要素は、TRV によって String 型の値として解釈されます。TRV は、テンプレートオブジェクトの raw 構成要素(口語的にはテンプレート raw 値)を構築するために使用されます。TRV は TV と似ていますが、TRV ではエスケープシーケンスがリテラル内に現れるとおりに解釈される点が異なります。

注

TV は LineContinuation のコード単位を除外しますが、TRV はそれらを含めます。<CR><LF> および <CR> の LineTerminatorSequence は、TV と TRV の両方で <LF> に正規化されます。<CR> または <CR><LF> の列を含めるには、明示的な TemplateEscapeSequence が必要です。

12.10 セミコロン自動挿入

ほとんどの ECMAScript の文および宣言は、セミコロンで終了しなければなりません。このようなセミコロンは常にソーステキスト内に明示的に現れてもかまいません。ただし、利便性のため、特定の状況ではこのようなセミコロンをソーステキストから省略できます。これらの状況は、その状況でセミコロンがソースコードのトークンストリームに自動的に挿入される、と表現されます。

12.10.1 セミコロン自動挿入の規則

以下の規則において、「トークン」とは、箇条 12 で説明される現在の字句目標記号を使用して決定された、実際に認識された字句トークンを意味します。

セミコロン挿入には3つの基本規則があります。

  1. ソーステキストを左から右へ構文解析しているとき、文法のどの生成規則によっても許可されないトークン(問題のあるトークンと呼びます)に遭遇した場合、次の条件の1つ以上が真であれば、問題のあるトークンの前にセミコロンが自動的に挿入されます。

    • 問題のあるトークンが、直前のトークンから少なくとも1つの LineTerminator によって分離されている。
    • 問題のあるトークンが } である。
    • 直前のトークンが ) であり、挿入されたセミコロンが do-while 文(14.7.2)の終端セミコロンとして構文解析される。
  2. ソーステキストを左から右へ構文解析しているとき、入力トークンストリームの末尾に達し、構文解析器が入力トークンストリームを目標非終端記号の単一のインスタンスとして構文解析できない場合、入力ストリームの末尾にセミコロンが自動的に挿入されます。
  3. ソーステキストを左から右へ構文解析しているとき、文法のある生成規則によって許可されるトークンに遭遇したものの、その生成規則が制限された生成規則であり、そのトークンが制限された生成規則内の注記「[no LineTerminator here]」の直後にある終端記号または非終端記号の最初のトークンになる場合(したがって、そのようなトークンを制限トークンと呼びます)、かつその制限トークンが直前のトークンから少なくとも1つの LineTerminator によって分離されている場合、その制限トークンの前にセミコロンが自動的に挿入されます。

ただし、上記の規則にはさらに優先する条件があります。セミコロンを挿入すると空文として構文解析される場合、またはそのセミコロンが for 文のヘッダー内の2つのセミコロンのうちの1つになる場合(14.7.4 を参照)、セミコロンが自動的に挿入されることはありません。

注

文法内の制限された生成規則は、次に示すものだけです。

UpdateExpression[Yield, Await] : LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] ++ LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] -- UsingDeclaration[In, Yield, Await] : using [no LineTerminator here] BindingList[?In, ?Yield, ?Await, ~Pattern] ; ContinueStatement[Yield, Await] : continue ; continue [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ; BreakStatement[Yield, Await] : break ; break [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ; ReturnStatement[Yield, Await] : return ; return [no LineTerminator here] Expression[+In, ?Yield, ?Await] ; ThrowStatement[Yield, Await] : throw [no LineTerminator here] Expression[+In, ?Yield, ?Await] ; YieldExpression[In, Await] : yield yield [no LineTerminator here] AssignmentExpression[?In, +Yield, ?Await] yield [no LineTerminator here] * AssignmentExpression[?In, +Yield, ?Await] ArrowFunction[In, Yield, Await] : ArrowParameters[?Yield, ?Await] [no LineTerminator here] => ConciseBody[?In] AsyncFunctionDeclaration[Yield, Await, Default] : async [no LineTerminator here] function BindingIdentifier[?Yield, ?Await] ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } [+Default] async [no LineTerminator here] function ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncFunctionExpression : async [no LineTerminator here] function BindingIdentifier[~Yield, +Await]opt ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncMethod[Yield, Await] : async [no LineTerminator here] ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncGeneratorDeclaration[Yield, Await, Default] : async [no LineTerminator here] function * BindingIdentifier[?Yield, ?Await] ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } [+Default] async [no LineTerminator here] function * ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorExpression : async [no LineTerminator here] function * BindingIdentifier[+Yield, +Await]opt ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorMethod[Yield, Await] : async [no LineTerminator here] * ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncArrowFunction[In, Yield, Await] : async [no LineTerminator here] AsyncArrowBindingIdentifier[?Yield] [no LineTerminator here] => AsyncConciseBody[?In] CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] => AsyncConciseBody[?In] AsyncArrowHead : async [no LineTerminator here] ArrowFormalParameters[~Yield, +Await]

これらの制限された生成規則の実際上の効果は次のとおりです。

  • 構文解析器が ++ または -- トークンを後置演算子として扱う位置でそのトークンに遭遇し、直前のトークンと ++ または -- トークンの間に少なくとも1つの LineTerminator が存在した場合、++ または -- トークンの前にセミコロンが自動的に挿入されます。
  • using トークンに遭遇し、IdentifierName トークンの前に LineTerminator が存在する場合、using トークンの後にセミコロンが自動的に挿入されます。
  • continue、break、return、throw、または yield トークンに遭遇し、次のトークンの前に LineTerminator が存在する場合、continue、break、return、throw、または yield トークンの後にセミコロンが自動的に挿入されます。
  • アロー関数の引数の後、=> トークンの前に LineTerminator が存在する場合、セミコロンが自動的に挿入され、その区切り子によって構文エラーが発生します。
  • async トークンの後、function、IdentifierName、または ( トークンの前に LineTerminator が存在する場合、セミコロンが自動的に挿入され、async トークンは後続のトークンと同じ式またはクラス要素の一部として扱われません。
  • async トークンの後、* トークンの前に LineTerminator が存在する場合、セミコロンが自動的に挿入され、その区切り子によって構文エラーが発生します。

その結果、ECMAScript プログラマーへの実用的な助言は次のようになります。

  • 後置 ++ または -- 演算子は、そのオペランドと同じ行に置くべきです。
  • using 宣言内の BindingList は、using トークンと同じ行から開始するべきです。
  • return または throw 文内の Expression、あるいは yield 式内の AssignmentExpression は、return、throw、または yield トークンと同じ行から開始するべきです。
  • break または continue 文内の LabelIdentifier は、break または continue トークンと同じ行に置くべきです。
  • アロー関数の引数の末尾とその => は同じ行に置くべきです。
  • 非同期関数またはメソッドに先行する async トークンは、直後のトークンと同じ行に置くべきです。

12.10.2 セミコロン自動挿入の例

この節は非規範的です。

次のソース

{ 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;
注 1

LineTerminator が式 a + b とトークン return を分離しているため、式 a + b は return 文によって返される値として扱われません。

次のソース

a = b
++c

は、セミコロン自動挿入によって次のように変換されます。

a = b;
++c;
注 2

b と ++ の間に LineTerminator があるため、トークン ++ は変数 b に適用される後置演算子として扱われません。

次のソース

if (a > b)
else c = d

は有効な ECMAScript 文ではなく、その位置では文法のどの生成規則も適用できないにもかかわらず、else トークンの前でセミコロン自動挿入によって変更されません。これは、自動的に挿入されたセミコロンが空文として構文解析されることになるためです。

次のソース

a = b + c
(d + e).print()

は、セミコロン自動挿入によって変換されません。これは、2行目の先頭にある括弧付き式を関数呼出しの引数リストとして解釈できるためです。

a = b + c(d + e).print()

代入文を左丸括弧で始めなければならない場合、プログラマーはセミコロン自動挿入に頼るのではなく、直前の文の末尾に明示的なセミコロンを記述することを推奨します。

12.10.3 セミコロン自動挿入の興味深いケース

この節は非規範的です。

ECMAScript プログラムは、セミコロン自動挿入に依存することで、非常に少ないセミコロンしか使用しないスタイルで記述できます。上で説明したように、セミコロンはすべての改行位置に挿入されるわけではなく、セミコロン自動挿入は行終端文字をまたぐ複数のトークンに依存する場合があります。

ECMAScript に新しい構文機能が追加されると、新しい文法生成規則が追加される可能性があり、その結果、その前でセミコロン自動挿入に依存していた行が、構文解析時に別の文法生成規則へ変化する場合があります。

この節では、直前のソーステキストに応じてセミコロンが挿入される場合と挿入されない場合がある箇所を、セミコロン自動挿入の興味深いケースとみなします。この節の残りでは、このバージョンの ECMAScript におけるセミコロン自動挿入の興味深いケースをいくつか説明します。

12.10.3.1 文リストにおけるセミコロン自動挿入の興味深いケース

StatementList では、多くの StatementListItem がセミコロンで終了し、そのセミコロンはセミコロン自動挿入を使用して省略できます。上記の規則の結果として、式を終了する行の末尾では、次の行が次のいずれかで始まる場合、セミコロンが必要です。

  • 左丸括弧(()。セミコロンがない場合、2行を合わせて CallExpression として扱います。
  • 左角括弧([)。セミコロンがない場合、2行を合わせて ArrayLiteral または ArrayAssignmentPattern ではなく、プロパティアクセスとして扱います。
  • テンプレートリテラル(`)。セミコロンがない場合、2行を合わせて、直前の式を MemberExpression とするタグ付き Template(13.3.11)として解釈します。
  • 単項 + または -。セミコロンがない場合、2行を合わせて、対応する二項演算子の使用として解釈します。
  • RegExp リテラル。セミコロンがない場合、たとえば RegExp にフラグがある場合、2行を合わせて / MultiplicativeOperator として構文解析されることがあります。

12.10.3.2 セミコロン自動挿入と「[no LineTerminator here]」のケース

この節は非規範的です。

ECMAScript には「[no LineTerminator here]」を含む文法生成規則があります。これらの生成規則は、文法で省略可能なオペランドを持たせるために使用されることがあります。これらの位置に LineTerminator を導入すると、省略可能なオペランドを持たない文法生成規則を使用することになり、ソーステキストの文法生成規則が変化します。

この節の残りでは、このバージョンの ECMAScript で「[no LineTerminator here]」を使用するいくつかの生成規則について説明します。

12.10.3.2.1 省略可能なオペランドと「[no LineTerminator here]」を持つ文法生成規則の一覧