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

 语义:

 产生式 SwitchStatement : switch ( Expression ) CaseBlock 按照下面的过程执行 :

  1. 令 exprRef 为解释执行 Expression 的结果 .
  2. 令 R 为以 GetValue(exprRef) 作为参数解释执行 CaseBlock 的结果。
  3. 如果 R.type 是 break 并且 R.target 在当前标签组内,返回 (normal, R.value, empty).
  4. 返回 R.

 产生式 CaseBlock : { CaseClausesopt } 以一个给定输入参数 input, 按照下面的过程执行 :

  1. 令 V = empty.
  2. 令 A 为以源代码中顺序排列的 CaseClause 列表。
  3. 令 searching 为 true.
  4. 只要 searching 为 true,就重复令 C 为 A 里的下一个 CaseClause。 如果没有 CaseClause 了,返回 (normal, V, empty).令 clauseSelector 为解释执行 C 的结果 .如果 input 和 clauseSelector 是 === 操作符定义的相等,则设定 searching 为 false.如果 C 有一个 StatementList, 则令 R 为解释执行 C 的 StatementList 的结果。如果 R 是个非常规完结 , 则返回 R。令 V =R.value
  5. 重复令 C 为 A 里的下一个 CaseClause。 如果没有 CaseClause 了,返回 (normal, V, empty).如果 C 有一个 StatementList, 则令 R 为解释执行 C 的 StatementList 的结果。如果 R.value 不是 empty, 则令 V =R.value.如果 R 是个非常规完结 , 则返回 (R.type,V,R.target).

 产生式 CaseBlock : { CaseClausesoptDefaultClause CaseClausesopt } 以一个给定输入参数 input, 按照下面的过程执行 :

  1. 令 V = empty.
  2. 令 A 为第一个 CaseClauses 中以源代码中顺序排列的 CaseClause 列表。
  3. 令 B 为第二个 CaseClauses 中以源代码中顺序排列的 CaseClause 列表。
  4. 令 found 为 false.
  5. 重复,使 C 为 A 中的依次每个 CaseClause。如果 found 是 false,则令 clauseSelector 为解释执行 C 的结果 .如果 input 和 clauseSelector 是 === 操作符定义的相等,则设定 found 为 true.如果 found 是 true,则如果 C 有一个 StatementList,则令 R 为解释执行 C 的 StatementList 的结果。如果 R.value 不是 empty, 则令 V =R.value.R 是个非常规完结 , 则返回 (R.type,V,R.target).
  6. 令 foundInB 为 false.
  7. 如果 found 是 false,则只要 foundInB 为 false 并且所有 B 中的元素都没有被处理,就重复令 C 为 B 里的下一个 CaseClause.令 clauseSelector 为解释执行 C 的结果 .如果 input 和 clauseSelector 是 === 操作符定义的相等,则设定 foundInB 为 true.如果 C 有一个 StatementList, 则令 R 为解释执行 C 的 StatementList 的结果。如果 R.value 不是 empty, 则令 V =R.value.R 是个非常规完结 , 则返回 (R.type,V,R.target).
  8. 如果 foundInB 是 false 并且 DefaultClause 有个 StatementList, 则令 R 为解释执行 DefaultClause 的 StatementList 的结果 .如果 R.value 不是 empty, 则令 V = R.value.如果 R 是个非常规完结 , 则返回 (R.type, V, R.target).
  9. 重复 ( 注 : 如果已执行步骤 7.a.i, 此循环不从 B 的开头开始。)令 C 为 B 的下一个 CaseClause。如果没有 CaseClause 了 , 返回 (normal, V, empty).如果 C 有个 StatementList, 则令 R 为解释执行 C 的 StatementList 的结果。如果 R.value 不是 empty, 则令 V = R.value.如果 R 是个非常规完结 , 则返回 (R.type, V, R.target).

 产生式 CaseClause : case Expression : StatementListopt 按照下面的过程执行 :

  1. 令 exprRef 为解释执行 Expression 的结果 .
  2. 返回 GetValue(exprRef).

 解释执行 CaseClause 不会运行相关的 StatementList。它只简单的解释执行 Expression 并返回值,这里的 CaseBlock 算法用于确定 StatementList 开始执行。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号