訳の正確性を保証するものではありませんので必要に応じて原文であるEcma InternationalのECMA-262にある ECMA-262.pdf ( ECMA-262 5.1 Edition )を参照下さい。
訳:2012年04月 webzoit.net
厳密なECMAScriptステートメント(emptyステートメント、variableステートメント、expressionステートメント、do-whileステートメント、continueステートメント、breakステートメント、returnステートメント、throwステートメント)は、セミコロンを伴った終端にしなければいけません。 そのようなセミコロンは、常にソーステキスト内に明示的に現れる場合があります。 利便性の為ではありますが、そのようなセミコロンが、特定の状況下ではソーステキストから省略される場合もあります。 これらの状況は、それらの状況におけるソースコード字句(トークン)ストリームにセミコロンが自動的に挿入されると言うことによって説明されます。
セミコロン挿入の基本ルールは3つあります。
しかしながら、それらは先行するルールにおける付加的な上書き条件です。 もし、そのセミコロンが、その際にカラのステートメントとして解析されたり、そのセミコロンがステートメント(12.6.3 for 文 参照)におけるヘッダ内にある2つのセミコロンの内の1つになる場合には、セミコロンが、自動的に挿入されることはありません。 [注釈] 次の内容は当該文法内で制限付き生成結果に限定されます。
PostfixExpression : LeftHandSideExpression [no LineTerminator here] ++ LeftHandSideExpression [no LineTerminator here] -- ( 後置式 : 左側の式 [ここに行終端はない] ++ 左側の式 [ここに行終端はない] -- ) ContinueStatement : continue [no LineTerminator here] Identifier ; ( continue 文 : continue [ここに行終端はない] 識別子(ラベル) ; ) BreakStatement : break [no LineTerminator here] Identifier ; ( break 文 : break [ここに行終端はない] 識別子(ラベル) ; ) ReturnStatement : return [no LineTerminator here] Expression ; ( return 文 : return [ここに行終端はない] 式 ; ) ThrowStatement : throw [no LineTerminator here] Expression ; ( throw 文 : throw [ここに行終端はない] 式 ; )
これら制限付き生成結果の実用的な効果は、次のようなものです。 ++ や -- という字句が現れる場合、パーサーは、後置演算子、つまり先行する字句と ++ や -- という字句の間に少なくとも1つの行終端(LineTerminator)が現れる場合には、 ++ や -- という字句の前にセミコロンが自動的に挿入されてしまいます。 continue/break/return/throwといった字句が現れ、行終端(LineTerminator)が、次の字句の前に現れる場合には、セミコロンは、continue/break/return/throwといった字句の後に自動的に挿入されてしまいます。 (よって)ECMAScriptプログラマへの結果的且つ実用的なアドバイスとしては、後置 ++ や -- 演算子は、そのオペランドと同一行に現れるべきです。 returnやthrowステートメント内の式は、returnやthrow字句と同一行で始まるべきです。 breakやcontinueステートメント内の識別子は、breakやcontinue字句と同一行にあるべきです。
ソース
{ 1 2 } 3
は、ECMAScript文法上、セミコロン自動挿入ルール上も有効な文ではありません。
対照的なソース
{ 1 2 } 3
もまた、有効なECMAScript文ではありませんが、自動セミコロン挿入によって次のように変換されます。
{ 1 ;2 ;} 3;
は、有効なECMAScript文です。
ソース
for (a; b )
は、有効なECMAScript文ではなく、文として構成するヘッダとしてセミコロンが必要とされる為、自動セミコロン挿入によって変更されません。 自動セミコロン挿入は、文として構成するヘッダ内にある2つのセミコロンの内1つだけ挿入するということはありません。
ソース
return a + b
は、自動セミコロン挿入によって次のように変換されます。
return; a + b;
[注釈] 式 a + b は、行終端(LineTerminator)が字句returnからそれを分割する為、return文によって返却される値として扱われることはありません。
ソース
a = b ++c
は、自動セミコロン挿入によって次のように変換されます。
a = b; ++c;
[注釈] 字句 ++ は、行終端(LineTerminator)が、b と ++ 間に現れる為、変数bに適用される後置演算子としては扱われません。
ソース
if (a > b) else c = d
は、有効なECMAScript文ではなく、自動的に挿入したセミコロンは、その際に空文として解釈される為、その時点において適用する文法のプロダクションであったとしても他の字句の前に自動セミコロン挿入によって変更されることはありません。
ソース
a = b + c (d + e).print()
は、2行めから始まるカッコで括られた式が関数呼び出し(ファンクションコール)における引数リストとして解釈されることが可能である為、自動セミコロン挿入によって変換されることはありません。
a = b + c(d + e).print()
左カッコで始まらなければならない文に関連する状況では、それは自動挿入セミコロンに頼ることなく先行する文の末尾に明示的にセミコロンを置くことはプログラマとして良い考えです。