?uem/p1-90`ECMAScript
字句入力要素の識別が、その入力要素を消費する構文文法の文脈に依存する状況がいくつかあります。このため、字句文法には複数の目標記号が必要です。
複数の字句目標を使用することで、セミコロン自動挿入に影響する字句上の曖昧さが存在しないことが保証されます。たとえば、先頭の除算または除算代入と、先頭の
a = b
/hi/g.exec(c).map(d);
a = b / hi / g.exec(c).map(d);
Unicode 書式制御文字(すなわち、LEFT-TO-RIGHT MARK や RIGHT-TO-LEFT MARK など、Unicode Character Database のカテゴリ「Cf」に属する文字)は、マークアップ言語などの上位レベルのプロトコルが存在しない場合に、一定範囲のテキストの書式を制御するために使用される制御コードです。
編集と表示を容易にするため、ソーステキスト内で書式制御文字を許可することは有用です。すべての書式制御文字は、コメント内、および文字列リテラル、テンプレートリテラル、正規表現リテラル内で使用できます。
U+FEFF (ZERO WIDTH NO-BREAK SPACE) は、主にテキストの先頭で、そのテキストが Unicode であることを示し、テキストの符号化方式およびバイト順を検出できるようにするために使用される書式制御文字です。この目的のための <ZWNBSP> 文字が、たとえばファイルの連結の結果として、テキストの先頭より後に現れる場合もあります。
空白コードポイントは、ソーステキストの可読性を向上させ、トークン(分割不可能な字句単位)を互いに分離するために使用されますが、それ以外の意味はありません。空白コードポイントは任意の2つのトークンの間、および入力の先頭または末尾に現れることができます。空白コードポイントは
ECMAScript の空白コードポイントを
| コードポイント | 名前 | 略称 |
|---|---|---|
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> |
U+0020 (SPACE) および U+00A0 (NO-BREAK SPACE) のコードポイントは <USP> の一部です。
空白コードポイントと同様に、行終端コードポイントはソーステキストの可読性を向上させ、トークン(分割不可能な字句単位)を互いに分離するために使用されます。ただし、空白コードポイントとは異なり、行終端文字は構文文法の動作にある程度影響します。一般に、行終端文字は任意の2つのトークンの間に現れることができますが、構文文法によって禁止される箇所がいくつかあります。行終端文字はセミコロン自動挿入(
行終端文字は
行終端文字は、正規表現の \s クラスに一致する空白コードポイントの集合に含まれます。
ECMAScript の行終端コードポイントを
| コードポイント | Unicode 名 | 略称 |
|---|---|---|
U+000A
|
LINE FEED (LF) | <LF> |
U+000D
|
CARRIAGE RETURN (CR) | <CR> |
U+2028
|
LINE SEPARATOR | <LS> |
U+2029
|
PARAGRAPH SEPARATOR | <PS> |
生成規則
コメントには単一行コメントと複数行コメントがあります。複数行コメントを入れ子にすることはできません。
単一行コメントには // マーカーから行末までのすべてのコードポイントで構成されます。ただし、行末の
コメントは空白のように動作し、破棄されます。ただし、
この節のいくつかの生成規則には、
Hashbang コメントは位置依存であり、他の種類のコメントと同様に、構文文法の入力要素ストリームから破棄されます。
この標準では、特定のコードポイントの追加を規定しています。U+0024 (DOLLAR SIGN) および U+005F (LOW LINE) は、
非終端記号
非終端記号 _ を導出します。
Unicode プロパティ「ID_Start」および「ID_Continue」を持つコードポイントの集合には、それぞれ Unicode プロパティ「Other_ID_Start」および「Other_ID_Continue」を持つコードポイントが含まれます。
Unicode エスケープシーケンスは \ は、いかなるコードポイントにも寄与しません。
Unicode Standard に従って正準的に等価な2つの
キーワードとは、fixed width フォントで文字どおりに現れます。ECMAScript のキーワードには、if、while、async、await など多数あります。
予約語とは、識別子として使用できない if と while は予約語です。await は async 関数とモジュールの内部でのみ予約されます。async は予約されておらず、制限なく変数名または文ラベルとして使用できます。
この仕様では、文法生成規則とawait と yield を除き、無条件に予約されています。await および yield の例外は、パラメーター化された構文生成規則を使用して
Math、window、toString、_ など、常に識別子として許可され、キーワードではないもの。
決して識別子として許可されないもの。すなわち、以下に列挙される await と yield を除くもの。
文脈に応じて識別子として許可されるもの。すなわち await と yield。
let、static、implements、interface、package、private、protected、および public。
常に識別子として許可される一方で、as、async、from、get、meta、of、set、および target。
条件付きキーワード、または 文脈依存キーワードという用語は、最後の3つのカテゴリに属し、一部の文脈では識別子として、その他の文脈ではキーワードとして使用できるキーワードを指すために使用されることがあります。
\
\ els\u{65} と記述して「else」という名前の変数を宣言することはできません。
enum は現在、この仕様ではキーワードとして使用されていません。これは将来の予約語であり、将来の言語拡張でキーワードとして使用するために予約されています。
同様に、implements、interface、package、private、protected、および public は、
たとえば、3in はエラーであり、2つの入力要素 3 と in ではありません。
数値リテラルは
文字列リテラルは、単一引用符または二重引用符で囲まれた0個以上の Unicode コードポイントです。Unicode コードポイントはエスケープシーケンスによって表すこともできます。終了引用符のコードポイント、U+005C (REVERSE SOLIDUS)、U+000D (CARRIAGE RETURN)、および U+000A (LINE FEED) を除き、すべてのコードポイントを文字列リテラル内に文字どおりに現すことができます。任意のコードポイントをエスケープシーケンスの形式で現すことができます。文字列リテラルは ECMAScript String 値に評価されます。これらの String 値を生成するとき、Unicode コードポイントは
非終端記号
<LF> および <CR> は、空のコードポイント列を生成する \n や \u000A などのエスケープシーケンスを使用することです。
文字列リテラルが、包含コードを
function invalid() { "\7"; "use strict"; }
文字列リテラルは
| エスケープシーケンス | コード単位値 | 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 |
\
|
以下の生成規則は正規表現リテラルの構文を説明し、入力要素スキャナーによって正規表現リテラルの終端を見つけるために使用されます。
実装は
正規表現リテラルを空にすることはできません。空の正規表現リテラルを表す代わりに、コード単位列 // は単一行コメントを開始します。空の正規表現を指定するには /(?:)/ を使用してください。
ほとんどの ECMAScript の文および宣言は、セミコロンで終了しなければなりません。このようなセミコロンは常にソーステキスト内に明示的に現れてもかまいません。ただし、利便性のため、特定の状況ではこのようなセミコロンをソーステキストから省略できます。これらの状況は、その状況でセミコロンがソースコードのトークンストリームに自動的に挿入される、と表現されます。
以下の規則において、「トークン」とは、箇条
セミコロン挿入には3つの基本規則があります。
ソーステキストを左から右へ構文解析しているとき、文法のどの生成規則によっても許可されないトークン(問題のあるトークンと呼びます)に遭遇した場合、次の条件の1つ以上が真であれば、問題のあるトークンの前にセミコロンが自動的に挿入されます。
} である。
) であり、挿入されたセミコロンが do-while 文(ただし、上記の規則にはさらに優先する条件があります。セミコロンを挿入すると空文として構文解析される場合、またはそのセミコロンが for 文のヘッダー内の2つのセミコロンのうちの1つになる場合(
文法内の制限された生成規則は、次に示すものだけです。
これらの制限された生成規則の実際上の効果は次のとおりです。
++ または -- トークンを後置演算子として扱う位置でそのトークンに遭遇し、直前のトークンと ++ または -- トークンの間に少なくとも1つの ++ または -- トークンの前にセミコロンが自動的に挿入されます。
using トークンに遭遇し、using トークンの後にセミコロンが自動的に挿入されます。
continue、break、return、throw、または yield トークンに遭遇し、次のトークンの前に continue、break、return、throw、または yield トークンの後にセミコロンが自動的に挿入されます。
=> トークンの前に async トークンの後、function、( トークンの前に async トークンは後続のトークンと同じ式またはクラス要素の一部として扱われません。
async トークンの後、* トークンの前に その結果、ECMAScript プログラマーへの実用的な助言は次のようになります。
++ または -- 演算子は、そのオペランドと同じ行に置くべきです。
using 宣言内の using トークンと同じ行から開始するべきです。
return または throw 文内の yield 式内の return、throw、または yield トークンと同じ行から開始するべきです。
break または continue 文内の break または continue トークンと同じ行に置くべきです。
=> は同じ行に置くべきです。
async トークンは、直後のトークンと同じ行に置くべきです。
次のソース
{ 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 とトークン return を分離しているため、式 a + b は return 文によって返される値として扱われません。
次のソース
a = b
++c
は、セミコロン自動挿入によって次のように変換されます。
a = b;
++c;
b と ++ の間に ++ は変数 b に適用される後置演算子として扱われません。
次のソース
if (a > b)
else c = d
は有効な ECMAScript 文ではなく、その位置では文法のどの生成規則も適用できないにもかかわらず、else トークンの前でセミコロン自動挿入によって変更されません。これは、自動的に挿入されたセミコロンが空文として構文解析されることになるためです。
次のソース
a = b + c
(d + e).print()
は、セミコロン自動挿入によって変換されません。これは、2行目の先頭にある括弧付き式を関数呼出しの引数リストとして解釈できるためです。
a = b + c(d + e).print()
代入文を左丸括弧で始めなければならない場合、プログラマーはセミコロン自動挿入に頼るのではなく、直前の文の末尾に明示的なセミコロンを記述することを推奨します。
ECMAScript プログラムは、セミコロン自動挿入に依存することで、非常に少ないセミコロンしか使用しないスタイルで記述できます。上で説明したように、セミコロンはすべての改行位置に挿入されるわけではなく、セミコロン自動挿入は行終端文字をまたぐ複数のトークンに依存する場合があります。
ECMAScript に新しい構文機能が追加されると、新しい文法生成規則が追加される可能性があり、その結果、その前でセミコロン自動挿入に依存していた行が、構文解析時に別の文法生成規則へ変化する場合があります。
この節では、直前のソーステキストに応じてセミコロンが挿入される場合と挿入されない場合がある箇所を、セミコロン自動挿入の興味深いケースとみなします。この節の残りでは、このバージョンの ECMAScript におけるセミコロン自動挿入の興味深いケースをいくつか説明します。
()。セミコロンがない場合、2行を合わせて [)。セミコロンがない場合、2行を合わせて `)。セミコロンがない場合、2行を合わせて、直前の式を + または -。セミコロンがない場合、2行を合わせて、対応する二項演算子の使用として解釈します。/ ECMAScript には「[no
この節の残りでは、このバージョンの ECMAScript で「[no