diff --git a/translated/issues-8.html b/translated/issues-8.html index c4dc2c1b0f..d20968f56b 100644 --- a/translated/issues-8.html +++ b/translated/issues-8.html @@ -12,29 +12,29 @@

算法约定

1. Subsubsubsubstep 1. Subsubsubsubsubstep -

一个步骤或者子步骤也许会使用“if”去断言它的子步骤的条件。在这样的案例中,这些子步骤只能适用于“if”断言为真的情况。如果一个步骤或者子步骤以“else”开始,那么表示这是之前的“if”断言的同一级的否定断言。

+

一个步骤或者子步骤也许会使用 “if” 去断言它的子步骤的条件。在这样的案例中,这些子步骤只能适用于 “if” 断言为真的情况。如果一个步骤或者子步骤以 “else” 开始,那么表示这是之前的 “if” 断言的同一级的否定断言。

一个步骤也许会指定它的子步骤的迭代程序。

-

一个以“Assert:”开头的步骤断言一个它的算法里不变的条件。这样的断言被用作使算法不变量显式地展示,否则它将是隐式的。这样的断言不增加额外的语义需求,因此在实现中不需要被检查。它们被使用只是为了使算法更清晰。

-

对于任意形如“Let _x_ be _someValue_”的值,算法步骤也许会声明命名别名。这些别名即可能通过_x_也可能通过_someValue_引用,它们指向同一个潜在的数据,并且修改其中任意一个对另一个都是可见的。那些想避免这样的类似引用的算法步骤需要显式地复制一份右值:即“Let_x_ be a copy of _someValue_”创建了一个_someValue_的浅复制。

-

一旦声明完毕,别名也许会在随后的任意步骤或者子步骤中被引用,但是它们也许不会在最高级步骤中被引用。别名也许会通过形如“Set _x_ to _someOtherValue_”这样的形式被修改。

+

一个以 “Assert:” 开头的步骤断言一个它的算法里不变的条件。这样的断言被用作使算法不变量显式地展示,否则它将是隐式的。这样的断言不增加额外的语义需求,因此在实现中不需要被检查。它们被使用只是为了使算法更清晰。

+

对于任意形如 “Let _x_ be _someValue_” 的值,算法步骤也许会声明命名别名。这些别名即可能通过 _x_ 也可能通过 _someValue_ 引用,它们指向同一个潜在的数据,并且修改其中任意一个对另一个都是可见的。那些想避免这样的类似引用的算法步骤需要显式地复制一份右值:即 “Let_x_ be a copy of _someValue_” 创建了一个 _someValue_ 的浅复制。

+

一旦声明完毕,别名也许会在随后的任意步骤或者子步骤中被引用,但是它们也许不会在最高级步骤中被引用。别名也许会通过形如 “Set _x_ to _someOtherValue_” 这样的形式被修改。

抽象操作

-

为了促进它们在本规范的多个地方使用,一些算法,我们称之为抽象操作,在参数化的函数形式中中命名和书写,以便它们能够在其它算法中通过名称来引用。抽象操作通常是被通过一个功能化的应用风格引用,如 OperationName(_arg1_, _arg2_)。一些抽象操作被当作像类规范里抽象的多态发送一样。这样的类似类的方法抽象操作通常通过一个方法应用风格被引用,如_someValue_.OperationName(_arg1_, _arg2_)。

+

为了促进它们在本规范的多个地方使用,一些算法,我们称之为抽象操作,在参数化的函数形式中中命名和书写,以便它们能够在其它算法中通过名称来引用。抽象操作通常是被通过一个功能化的应用风格引用,如 OperationName(_arg1_, _arg2_)。一些抽象操作被当作像类规范里抽象的多态发送一样。这样的类似类的方法抽象操作通常通过一个方法应用风格被引用,如 _someValue_.OperationName(_arg1_, _arg2_)。

-

特定语法操作

-

一个特定语法操作是一个具有名称的操作,它的定义包含了一系列算法,每个算法与一个或者多个ECMAScript文法的产生式相关联。一个有多个可选定义的产生式通常对于每个可选部分都有一个独立的算法。当一个算法与一个文法产生式相关联的时候,它也许会引用这个产生式可选部分的终结符或者非终结符,就好像它们是这个算法的参数一样。当出现这种情况时,非终结符指向实际的源代码中与之匹配的可选部分的定义。

-

当一个算法与一个产生式的可选部分关联的时候,这个可选部分通常不会带上“[ ]”文法注释。这样的注释只应该影响可选部分的语法识别,不应该对相关的可选部分的语义有影响。

-

特定语法操作同一个解析节点一起被调用,还可以在步骤1,3,4中使用这个约定的其它参数:

+

语法导向操作

+

一个语法导向操作是一个具名操作,它的定义包含了一系列算法,每个算法与一个或者多个 ECMAScript 文法的产生式相关联。一个有多个可选定义的产生式通常对于每个可选部分都有一个独立的算法。当一个算法与一个文法产生式相关联的时候,它也许会引用这个产生式可选部分的终结符或者非终结符,就好像它们是这个算法的参数一样。当出现这种情况时,非终结符指向实际的源代码中与之匹配的可选部分的定义。

+

当一个算法与一个产生式的可选部分关联的时候,这个可选部分通常不会带上 “[ ]” 文法注释。这样的注释只应该影响可选部分的语法识别,不应该对相关的可选部分的语义有影响。

+

语法导向操作同一个解析节点一起被调用,还可以在步骤 1,3,4 中使用这个约定的其它参数:

1. Let _status_ be the result of performing SyntaxDirectedOperation of |SomeNonTerminal|. 2. Let _someParseNode_ be the parse of some source text. 2. Perform SyntaxDirectedOperation of _someParseNode_. 2. Perform SyntaxDirectedOperation of _someParseNode_ passing `"value"` as the argument. -

除非显式地指定,否则,所有相关联的产生式对于每个也许会被应用到这个产生式左值的非终结符的操作都有一个隐式的定义。如果存在的话,这个隐式的定义简单地再次对同样的参数运用这个相同的定义,对于这些相关联的产生式唯一的右值非终结符,随后返回处理结果。例如,假设一些算法有如下形式的步骤:“返回被解析的块的结果(Return the result of evaluating Block)”,并且这里有一个产生式:

+

除非显式地指定,否则,所有相关联的产生式对于每个也许会被应用到这个产生式左值的非终结符的操作都有一个隐式的定义。如果存在的话,这个隐式的定义简单地再次对同样的参数运用这个相同的定义,对于这些相关联的产生式唯一的右值非终结符,随后返回处理结果。例如,假设一些算法有如下形式的步骤: “Return the result of evaluating |Block|”,并且这里有一个产生式:

Block : `{` StatementList `}` @@ -53,7 +53,7 @@

运行时语义

必须在运行时被调用的指定语义的算法就叫运行时语义。 运行时语义通过抽象操作或者指定语法操作来定义。这样的算法必须返回一个完成记录。

隐式完成值

-

本规范的算法常常隐式地返回一个[[Type]]值为normal的完成记录。除非它是上下文中另外非常明显的部分,一个返回一个值的算法语句,那么这个值将不是一个完成值。例如:

+

本规范的算法常常隐式地返回一个 [[Type]] 值为 ~normal~ 的 Completion Records。除非一个返回一个值的算法语句在上下文明显指定返回一个不是 Completion Record 的值。例如:

1. Return `"Infinity"`. @@ -61,17 +61,17 @@

隐式完成值

1. Return NormalCompletion(`"Infinity"`). -

然而,如果一个“return”语句的值表达式是一个完成记录构造的字面量,那么完成记录的结果将被返回。如果这个值表达式是一个对抽象操作的调用,那么“return”语句简单地返回这个抽象操作产生的完成记录。

-

抽象操作Completion(_completionRecord_)被用作强调之前计算的Completion Record被返回。Completion这个抽象操作接收一个参数,即_completionRecord_,然后执行下面的步骤:

+

然而,如果一个 “return” 语句的值表达式是一个 Completion Record 构造的字面量,那么 Completion Record 的结果将被返回。如果这个值表达式是一个对抽象操作的调用,那么 “return” 语句简单地返回这个抽象操作产生的 Completion Record。

+

抽象操作 Completion(_completionRecord_) 被用作强调之前计算的 Completion Record 被返回。Completion 这个抽象操作接收一个参数,即 _completionRecord_,然后执行下面的步骤:

1. Assert: _completionRecord_ is a Completion Record. 1. Return _completionRecord_ as the Completion Record of this abstract operation. -

一个在算法步骤中没有值的“return” 语句与下面的是同样的意思:

+

一个在算法步骤中没有值的 “return” 语句与下面的是同样的意思:

1. Return NormalCompletion(`undefined`). -

对于任意的在一个上下文中没有显示地需要一个完整的Completion Record值的引用,等价于一个显式地对Completion Record的[[Value]]字段的引用,除非Completion Record是一个打断/中断完成。

+

对于任意的在一个上下文中没有显示地需要一个完整的 Completion Record 值的引用,等价于一个显式地对 Completion Record 的 [[Value]] 字段的引用,除非 Completion Record 是一个中断完成

@@ -89,7 +89,7 @@

抛出一个异常

-

返回

+

ReturnIfAbrupt

算法步骤说明或者等同于:

1. ReturnIfAbrupt(_argument_). @@ -109,7 +109,7 @@

返回

1. If _hygienicTemp_ is an abrupt completion, return _hygienicTemp_. 1. Else if _hygienicTemp_ is a Completion Record, let _hygienicTemp_ be _hygienicTemp_.[[Value]].
-

这里的_hygienicTemp_是短暂的(临时的),并且只在ReturnIfAbrupt有关的步骤中中可见。

+

这里的 _hygienicTemp_ 是临时的,并且只在 ReturnIfAbrupt 有关的步骤中中可见。

算法步骤说明或者等同于:

1. Let _result_ be AbstractOperation(ReturnIfAbrupt(_argument_)). @@ -122,8 +122,8 @@

返回

-

如果被打断则返回 缩写

-

对抽象操作和以`?`为前缀的指定语法操作的调用暗示着ReturnIfAbrupt需要被应用到结果的Completion Record中。 例如,步骤:

+

如果被打断则返回缩写

+

对抽象操作和以 `?` 为前缀的指定语法操作的调用暗示着 ReturnIfAbrupt 需要被应用到结果的 Completion Record 中。 例如,步骤:

1. ? OperationName(). @@ -139,7 +139,7 @@

如果被打断则返回 缩写 1. ReturnIfAbrupt(_someValue_.OperationName()). -

相似的,前缀`!`被用作暗示下列的对于抽象或者指定语法操作的调用将不会返回一个打断的完成值, 并且作为结果的Completion Record的[[Value]]字段应该被用作替换操作的返回值。 例如,步骤:

+

相似的,前缀 `!` 被用作暗示下列的对于抽象或者指定语法操作的调用将不会返回一个打断的完成值, 并且作为结果的 Completion Record 的 [[Value]] 字段应该被用作替换操作的返回值。 例如,步骤:

1. Let _val_ be ! OperationName(). @@ -149,7 +149,7 @@

如果被打断则返回 缩写 -

对于运行时语义的指定语法的操作通过在调用操作前替换`!`或者`?`来利用这个缩写。

+

对于运行时语义的指定语法的操作通过在调用操作前替换 `!` 或者 `?` 来利用这个缩写。

1. Perform ! SyntaxDirectedOperation of |NonTerminal|. @@ -158,9 +158,9 @@

如果被打断则返回 缩写

静态语义

-

上下文无关文法不能足够好的去表达所有定义的规则, 不管是一个输入元素的流形成的一个合法的将被解析的ECMAScript |Script|还是|Module|。 在一些情况中,需要额外的规则通过使用ECMAScript算法约定或者散文要求来展示。这样的规则总是与一个文法的产生式相关联,被称作产生式的静态语义

-

静态语义规则拥有名称,并且通常用一个算法来定义。 具有名称的静态语义规则与文法产生式相关联,对于每个可采用的具有名称的静态语义规则, 一个包含多个可选部分定义的产生式通常会对每个可选部分定义一个独有的算法。

-

除非在本规范中其它指定的文法产生式可选部分隐式地包含一个叫做Contains的接收一个值为包含相关产生式的文法的终结符或者非终结符的_symbol_参数静态语义规则的定义。 默认的包含定义为:

+

上下文无关文法不能足够好的去表达所有定义的规则,不管是一个输入元素的流形成的一个合法的将被解析的 ECMAScript |Script| 还是 |Module|。在一些情况中,需要额外的规则通过使用 ECMAScript 算法约定或者散文要求来展示。这样的规则总是与一个文法的产生式相关联,被称作产生式的静态语义

+

静态语义规则拥有名称,并且通常用一个算法来定义。具有名称的静态语义规则与文法产生式相关联,对于每个可采用的具有名称的静态语义规则, 一个包含多个可选部分定义的产生式通常会对每个可选部分定义一个独有的算法。

+

除非在本规范中其它指定的文法产生式可选部分隐式地包含一个叫做 Contains 的接收一个值为包含相关产生式的文法的终结符或者非终结符的 _symbol_ 参数静态语义规则的定义。 默认的包含定义为:

1. For each child node _child_ of this Parse Node, do 1. If _child_ is an instance of _symbol_, return *true*. @@ -170,15 +170,15 @@

静态语义

1. Return *false*.

上面的定义是显式地重写了规范的产生式。

-

一个特殊的静态语义规则是早期(提前)错误规则。早期错误规则定了早期错误条件(见),它们与具体的文法产生式相关联。大多数早期错误规则的解析不是在本规范的算法中显式地被调用。一个符合规范的实现必须在第一次解析|Script|或者|Module|之前,验证所有被用作解析|Script|或者|Module|的产生式的早期错误规则。如果违反了任意的早期错误规则,那么|Script|或者|Module|就是不合法的,并且不能被解析执行。

+

一个特殊的静态语义规则是早期(提前)错误规则。早期错误规则定了早期错误条件(见 ),它们与具体的文法产生式相关联。大多数早期错误规则的解析不是在本规范的算法中显式地被调用。一个符合规范的实现必须在第一次解析 |Script| 或者 |Module| 之前,验证所有被用作解析 |Script| 或者 |Module| 的产生式的早期错误规则。如果违反了任意的早期错误规则,那么 |Script| 或者 |Module| 就是不合法的,并且不能被解析执行。

数学操作

-

除非其它地方特别注明不包括无限并且不包括负0(为了与正0区分),数学操作,例如加,减,否定(逻辑非),乘,除以及随后在条款中定义的数学函数应总是被当作是对于数学中所有真实数字计算出来的准确的结果。本规范算法中的浮点运算包含显式地的步骤,它们对于处理无穷,有符号的0,以及舍入是必要的。如果一个数学操作或者函数被应用在一个浮点数上,那么它必须被当作应用到用浮点数表示的具体的数学值;这样的浮点数必须是有限的,并且如果它是`+0`或者`-0`的话,那么相应的数学值就是简简单单的0。

-

数学函数abs(_x_)用来计算_x_的绝对值, 如果_x_是负数,那么结果就是-_x_,否则结果就是_x_本身。

-

数学函数min(_x1_, _x2_, ..., _xN_)计算从_x1__xN_的最小值。 数学函数max(_x1_, _x2_, ..., _xN_)计算从_x1__xN_的最大值。 这些数学函数的域以及范围包括`+∞`和`-∞`。

-

符号“_x_ modulo _y_”(_y_必须是有限的且是非0的)计算出一个值_k_, 它的符号与_y_一致(或者是0),这样的_k_满足abs(k)< abs(y),以及能找到某个整数y,使得_x_-_k_ = _q_ * _y_。

-

The mathematical functionfloor(_x_) produces the largest integer (closest to positive infinity) that is not larger than_x_.

+

除非其它地方特别注明不包括无限并且不包括负 0(为了与正 0 区分),数学操作,例如加,减,否定(逻辑非),乘,除以及随后在条款中定义的数学函数应总是被当作是对于数学中所有真实数字计算出来的准确的结果。本规范算法中的浮点运算包含显式地的步骤,它们对于处理无穷,有符号的0,以及舍入是必要的。如果一个数学操作或者函数被应用在一个浮点数上,那么它必须被当作应用到用浮点数表示的具体的数学值;这样的浮点数必须是有限的,并且如果它是 *+0* 或者 *-0* 的话,那么相应的数学值就是简简单单的 0。

+

数学函数 abs(_x_) 用来计算 _x_ 的绝对值,如果 _x_ 是负数,那么结果就是 -_x_,否则结果就是 _x_ 本身。

+

数学函数 min(_x1_, _x2_, ..., _xN_) 计算从 _x1__xN_ 的最小值。 数学函数 max(_x1_, _x2_, ..., _xN_) 计算从 _x1__xN_ 的最大值。 这些数学函数的域以及范围包括 *+∞* 和 *-∞*。

+

符号 “_x_ modulo _y_” ( _y_ 必须是有限的且是非 0 的)计算出一个值 _k_, 它的符号与 _y_ 一致(或者是 0),这样的 _k_ 满足 abs(k) < abs(y),以及能找到某个整数y,使得 _x_-_k_ = _q_ * _y_。

+

数学函数 floor(_x_) 产生一个不大于 _x_ 的最大整数(最接近正无穷)。

floor(_x_) = _x_-(_x_ modulo 1).