訳の正確性を保証するものではありませんので必要に応じて原文であるEcma InternationalのECMA-262にある ECMA-262.pdf ( ECMA-262 5.1 Edition )を参照下さい。
訳:2012年04月 webzoit.net
【構文】 SwitchStatement : switch ( Expression ) CaseBlock CaseBlock : { CaseClausesopt } { CaseClausesopt DefaultClause CaseClausesopt } CaseClauses : CaseClause CaseClauses CaseClause CaseClause : case Expression : StatementListopt DefaultClause : default : StatementListopt
【セマンティックス】 プロダクション
SwitchStatement : switch ( Expression ) CaseBlock
は、次のように評価されます。
1. exprRef は、Expressionを評価した結果とする 2. R は、パラメータとして GetValue(exprRef)を渡すことによってCaseBlockを評価した結果とする 3. R.type が、 break 且つ、 R.target が、現在のラベルのセット内にある場合、return (normal, R.value, empty) 4. Rを返す
プロダクション
CaseBlock : { CaseClausesopt }
は、入力パラメータ input が与えられ、次のように評価されます。
1. V = empty とする 2. A は、ソーステキスト順におけるCaseClauseアイテムのリストとする 3. searching は、true とする 4. searching が trueである間、繰り返す a. C は、 A にある次のCaseClauseとする、そのようなCaseClauseがない場合、return (normal, V, empty) b. clauseSelector は、C を評価した結果とする c. input が、 === 演算子によって定義したように clauseSelector と同等である場合、 i. searching に false を設定 ii. C が、StatementListを持つ場合、 1. C のStatementListを評価し、 R は、 result とする 2. R が、中途完了(an abrupt completion)である場合、R を返す 3. V = R.value とする 5.繰り返す a. C は、 A にある次のCaseClauseとする、もし、そのようなCaseClauseがない場合、return (normal, V, empty) b. C が、StatementListを持つ場合、 i. C のStatementListを評価し、 R は、 result とする ii. R.value が、emptyではない場合、 V = R.valueとする iii. R が、中途完了(an abrupt completion)である場合、return (R.type, V, R.target)
プロダクション
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
は入力パラメータ input を与えられ、次のように評価されます。
1. V = empty とする 2. A は、ソーステキスト順において1つめのCaseClausesとなるCaseClauseアイテムのリストとする 3. B は、ソーステキスト順において2つめのCaseClausesとなるCaseClauseアイテムのリストとする 4. found は、falseとする 5. AにあるCaseClauseごとに順に文字 C として繰り返す a. found が、 falseである場合、 i. clauseSelector は、 C を評価した結果とする ii. input が、 === 演算子によって定義したようにclauseSelectorと同等である場合、 found に trueを設定 b. found が、 trueである場合 i. C が、StatementListを持つ場合、 1. C のStatementListを評価し、 R は、 result とする 2. R.value が、emptyではない場合、 V = R.value とする 3. R が、中途完了(an abrupt completion)である場合、return (R.type, V, R.target)とする 6. foundInB は、 falseとする 7. found が、 falseである場合、 a. foundInB 且つ、未処理の B の要素全てが、falseの間、繰り返す i. C は、B にある次のCaseClauseとする ii. clauseSelectorは、 Cを評価した結果とする iii. input が、 === 演算子によって定義したようにclauseSelectorと同等である場合、 1. foundInB にtrueを設定 2. C が、 StatementListを持つ場合、 a CのStatementListを評価し、 R は、 resultとする b もし、 R.value が、emptyではない場合、 V = R.valueとする c もし、R が、中途完了(an abrupt completion)である場合、return (R.type, V, R.target)とする 8. foundInB が、false且つ、 DefaultClause が、StatementListを持つ場合、 a.DefaultClauseのStatementListを評価し、 R は、 resultとする b. R.value が、 emptyではない場合、 V = R.valueとする c. R 、中途完了(an abrupt completion)である場合、return (R.type, V, R.target)とする 9.繰り返す(注記として ステップ 7.a.i が実行される場合には、このループは、Bの始点で始まらない) a. C は、Bにある次のCaseClauseとする、そのようなCaseClauseがない場合、return (normal, V, empty)とする b. C が、StatementListを持つ場合、 i. C のStatementListを評価し、 R は、resultとする ii. R.value が、 emptyではない場合、 V = R.value とする iii. R が、中途完了(an abrupt completion)である場合、return (R.type, V, R.target)とする
プロダクション
CaseClause : case Expression : StatementListopt
は、次のように評価されます。
1. exprRef は、Expressionを評価した結果とする 2. GetValue(exprRef)を返す
[注釈] 評価中のCaseClauseは、関連するStatementListを実行しません。 それは、単にExpressionを評価し、どのStatementListの実行を開始するかを決める為に使用されるCaseBlockアルゴリズムにおける値を返します。