块语句
- 对于空 {} 块语句返回(normal, empty)
- 对于{ statementList }
- 对于statementList: statement情况执行statement并返回结果
- 对于statementList: statementList statement,首先执行statementList并拿到结果v1,如果有提前return则返回v1;否则执行statement拿到结果v2,如果有异常返回{ throw, v };否则判断v2是否为empty;是则将v赋值为v1否则赋值为v2,返回{ normal, v2}
变量语句
- 对于声明变量语句var|let|const|class|import|export|function name [= init]返回{ normal, empty }
- 对于初始化语句 name=init返回{ normal, init }
空语句
- ;返回{ normal, empty }
表达式语句
- expression返回 { normal, getValue(expression) }
if语句
- if(expression) statement1 else statement2
- 拿到expression的expRef,并通过ToBoolean(getValue(expRef))判断真假,真则返回statement1的返回值,否则返回statement2的返回值
- if(expression) statement 同上,不过判断为假时返回{ normal, empty }
循环语句
- 各个循环返回值过程基本相同,就使用while(expression) { statement }举例
- let v = empty
- repeat
- let exprRef 为expression 执行后的结果
- if ToBoolean(getValue(exprRef)) 为 false, return { normal, v }
- let stmt = statement的执行结果
- 如果stmt != empty, 则v = stmt.value
- 如果stmt.type != continue || stmt.target 不是标签
- 如果stmt.type = break && stmt.target是标签则返回 { normal, v }
- 否则返回 stmt
break语句
- break; 返回{ normal, empty }
- break labelname; 返回{ normal, empty, labelname }
return语句
- return; 返回{ return, undefined }
- return expression; 返回{ return, getValue(exprRef(expression)) }
抛出语句
- throw expression; 返回{ throw, getValue(exprRef(expression)) }
try...catch...finally语句
-
try block catch
- let B = Block的结果
- if B.type != throw则返回B
- 否则返回以B作为参数的catch的执行结果
-
try block finally
- let B = Block结果
- let F = finally结果
- if F.type == normal返回B的结果
- 否则返回F
-
try block catch finally
- let B = block的结果
- if B.type != throw,则let C = B
- 否则 let C = 以B作为参数的catch的执行结果
- let F = finally结果
- if F.type == normal返回C的结果
- 否则返回F