【问题标题】:confusion in ecmascript productionsecmascript 制作中的混乱
【发布时间】:2021-12-04 08:01:25
【问题描述】:

我最近对 ​​ecma262 规范中的产品感到困惑。

根据我的假设,有些作品可能是其他作品。

例如,声明

Statement 可以是 Block 它也可以是 IfStatement

我的困惑始于看起来像这样的算法

一个。让 stmtCompletion 成为评估第一个 Statement 的结果。

评估声明?什么意思?

如果一个Statement,例如,是一个IfStatement,它会去14.6 The if Statement 14.6.2 Runtime Semantics: Evaluation 吗?

我很困惑,因为有些作品有他们的 RS:评估,例如 IfStatement,而有些作品没有 RS:评估 比如声明声明等等……

【问题讨论】:

    标签: javascript ecma262


    【解决方案1】:

    如果一个Statement,例如,是一个IfStatement,它会去14.6 The if Statement 14.6.2 Runtime Semantics: Evaluation 吗?

    是的。

    我很困惑,因为有些作品有他们的 RS:评估,例如 IfStatement,而有些作品没有 RS:评估 比如声明声明等等……

    什么意思?

    这(在规范的最新版本中)甚至在 §5.2.2 Syntax-Directed Operations 中进行了解释。特别是,

    除非另有明确说明,否则所有链式产生式对每个可能应用于该产生式左侧非终结符的操作都有一个隐式定义。隐式定义只是简单地将具有相同参数的相同操作(如果有)重新应用到链生产的唯一右侧非终结符,然后返回结果。例如,假设某个算法具有以下形式的步骤:“返回评估Block的结果”并且有一个产生式:

    Block : { StatementList }

    但评估操作不会将算法与该产生式相关联。在这种情况下,Evaluation 操作隐式包含以下形式的关联:

    运行时语义:评估

    Block : { StatementList }

    1. 返回评估StatementList的结果。

    因此,由于Statement production 没有“运行时语义:评估”,因此它会获得隐式语义,只会评估相应的语句类型。

    【讨论】:

    • "让 stmtCompletion 成为评估第一条语句的结果。"这只是一个例子,我展示了一些算法使用评估语句的场景,我不确定它到底做了什么。我以“14.6.2 运行时语义:评估”为例
    • 所以这意味着基本上没有“运行时语义:评估”的产品是指他们的孩子(也可以是他们的孙子)的“运行时语义:评估”?更详细地说,Statement 子项是 IfStatement、VariableStatement 等......因此,当我遇到类似“a. Let stmtCompletion 是评估第一个 Statement 的结果”这样的算法时,这意味着它可能会进入 IfStatement 评估,或者它可能评估一个变量语句。但这取决于我编写的代码。我理解正确吗?
    • @AngryJohn 是的,正是这样。
    • 但它不是说“链式产生式是一种在其右侧只有一个非终结符以及零个或多个终结符的产生式。”根据我的理解,它说一个只有一个非终端以及右侧有零个或多个终端的产品具有您所指出的那些隐含的“运行时语义:评估”。所以 Statement 不是连锁生产吗?因为它的右手边有多个非终结符,所以它有 BlockStatement、VariableStatement、EmptyStatement 等......或者它们的意思是另一种选择?
    • 是的,它指的是个人productionsStatement 是非终结符,Statement → BlockStatement 是链式生产。
    猜你喜欢
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 2011-07-19
    • 1970-01-01
    • 2014-02-10
    • 2017-07-23
    • 2015-07-09
    相关资源
    最近更新 更多