switch 語句

2018-06-16 15:23 更新

語法:

SwitchStatement : switch ( Expression ) CaseBlock CaseBlock : { CaseClausesopt } { CaseClausesoptDefaultClause CaseClausesopt }CaseClauses : CaseClause CaseClauses CaseClause CaseClause : case Expression : StatementListopt DefaultClause : default : StatementListopt

 語義:

 產(chǎn)生式 SwitchStatement : switch ( Expression ) CaseBlock 按照下面的過程執(zhí)行 :

  1. 令 exprRef 為解釋執(zhí)行 Expression 的結(jié)果 .
  2. 令 R 為以 GetValue(exprRef) 作為參數(shù)解釋執(zhí)行 CaseBlock 的結(jié)果。
  3. 如果 R.type 是 break 并且 R.target 在當(dāng)前標(biāo)簽組內(nèi),返回 (normal, R.value, empty).
  4. 返回 R.

 產(chǎn)生式 CaseBlock : { CaseClausesopt } 以一個(gè)給定輸入?yún)?shù) input, 按照下面的過程執(zhí)行 :

  1. 令 V = empty.
  2. 令 A 為以源代碼中順序排列的 CaseClause 列表。
  3. 令 searching 為 true.
  4. 只要 searching 為 true,就重復(fù)令 C 為 A 里的下一個(gè) CaseClause。 如果沒有 CaseClause 了,返回 (normal, V, empty).令 clauseSelector 為解釋執(zhí)行 C 的結(jié)果 .如果 input 和 clauseSelector 是 === 操作符定義的相等,則設(shè)定 searching 為 false.如果 C 有一個(gè) StatementList, 則令 R 為解釋執(zhí)行 C 的 StatementList 的結(jié)果。如果 R 是個(gè)非常規(guī)完結(jié) , 則返回 R。令 V =R.value
  5. 重復(fù)令 C 為 A 里的下一個(gè) CaseClause。 如果沒有 CaseClause 了,返回 (normal, V, empty).如果 C 有一個(gè) StatementList, 則令 R 為解釋執(zhí)行 C 的 StatementList 的結(jié)果。如果 R.value 不是 empty, 則令 V =R.value.如果 R 是個(gè)非常規(guī)完結(jié) , 則返回 (R.type,V,R.target).

 產(chǎn)生式 CaseBlock : { CaseClausesoptDefaultClause CaseClausesopt } 以一個(gè)給定輸入?yún)?shù) input, 按照下面的過程執(zhí)行 :

  1. 令 V = empty.
  2. 令 A 為第一個(gè) CaseClauses 中以源代碼中順序排列的 CaseClause 列表。
  3. 令 B 為第二個(gè) CaseClauses 中以源代碼中順序排列的 CaseClause 列表。
  4. 令 found 為 false.
  5. 重復(fù),使 C 為 A 中的依次每個(gè) CaseClause。如果 found 是 false,則令 clauseSelector 為解釋執(zhí)行 C 的結(jié)果 .如果 input 和 clauseSelector 是 === 操作符定義的相等,則設(shè)定 found 為 true.如果 found 是 true,則如果 C 有一個(gè) StatementList,則令 R 為解釋執(zhí)行 C 的 StatementList 的結(jié)果。如果 R.value 不是 empty, 則令 V =R.value.R 是個(gè)非常規(guī)完結(jié) , 則返回 (R.type,V,R.target).
  6. 令 foundInB 為 false.
  7. 如果 found 是 false,則只要 foundInB 為 false 并且所有 B 中的元素都沒有被處理,就重復(fù)令 C 為 B 里的下一個(gè) CaseClause.令 clauseSelector 為解釋執(zhí)行 C 的結(jié)果 .如果 input 和 clauseSelector 是 === 操作符定義的相等,則設(shè)定 foundInB 為 true.如果 C 有一個(gè) StatementList, 則令 R 為解釋執(zhí)行 C 的 StatementList 的結(jié)果。如果 R.value 不是 empty, 則令 V =R.value.R 是個(gè)非常規(guī)完結(jié) , 則返回 (R.type,V,R.target).
  8. 如果 foundInB 是 false 并且 DefaultClause 有個(gè) StatementList, 則令 R 為解釋執(zhí)行 DefaultClause 的 StatementList 的結(jié)果 .如果 R.value 不是 empty, 則令 V = R.value.如果 R 是個(gè)非常規(guī)完結(jié) , 則返回 (R.type, V, R.target).
  9. 重復(fù) ( 注 : 如果已執(zhí)行步驟 7.a.i, 此循環(huán)不從 B 的開頭開始。)令 C 為 B 的下一個(gè) CaseClause。如果沒有 CaseClause 了 , 返回 (normal, V, empty).如果 C 有個(gè) StatementList, 則令 R 為解釋執(zhí)行 C 的 StatementList 的結(jié)果。如果 R.value 不是 empty, 則令 V = R.value.如果 R 是個(gè)非常規(guī)完結(jié) , 則返回 (R.type, V, R.target).

 產(chǎn)生式 CaseClause : case Expression : StatementListopt 按照下面的過程執(zhí)行 :

  1. 令 exprRef 為解釋執(zhí)行 Expression 的結(jié)果 .
  2. 返回 GetValue(exprRef).

 解釋執(zhí)行 CaseClause 不會(huì)運(yùn)行相關(guān)的 StatementList。它只簡(jiǎn)單的解釋執(zhí)行 Expression 并返回值,這里的 CaseBlock 算法用于確定 StatementList 開始執(zhí)行。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)