javascript - `AssignmentExpression`如何从EcmaScript语法中的 `Statement`导出

标签 javascript ecmascript-6 context-free-grammar compiler-construction

假设我有以下 JS 代码部分:

const v = 3;

据我了解,它可以解析为 AssignmentExpression :
AssignmentExpression :
    LeftHandSideExpression = AssignmentExpression

现在我想知道它是如何从 Statement 派生出来的。 ?一种可能的路线是:
Statement -> ExpressionStatement -> Expression -> AssignmentExpression

但我不确定。这是对的吗?

这是我找到它的方法:
AssignmentExpression是部分 Expression :
Expression :
    AssignmentExpression
    Expression, AssignmentExpression

然后 ExpressionExpressionStatement 的一部分是
ExpressionStatement:

    [lookahead ∉ { {, function, ..., let [ }] Expression;

然后 ExpressionStatementStatement 的一部分:
Statement :
    ExpressionStatement

最佳答案

const v = 3;是一个声明,而不是一个赋值。有趣的是声明不是 Statement s,但可以出现在 StatementList s。所以你不能推导出const v = 3;来自 Statement ,但您可以从 StatementList .因此,如果您的脚本仅包含 const v = 3; ,完整的推导将是:

            Script
               |
          ScriptBody
               |
         StatementList
               |
       StatementListItem
               |
          Declaration
               |
      LexicalDeclaration
     /         |        \
LetOrConst BindingList  ';'
    |           |
 'const'   LexicalBinding
             /          \
     BindingIdentifier  Initializer
            |                |
         Identifier    AssignmentExpression
            |                  |
       IdentifierName         ...
            |                  |
           'v'                '5'

实际分配只是 v = 5; .那将通过ExpressionStatement以及来自 Statement 的推导看起来像这样:
                     Statement
                         |
               ExpressionStatement
                     /        \
                   Expression ';'
                        |
              AssignmentExpression
             /          |         \
LeftHandSideExpression '=' AssignmentExpression
         |                         |
    NewExpression                ...
         |                         |
   MemberExpression               '5'
         |
   PrimaryExpression              
         |
IdentifierReference
         |
     Identifier
         |
   IdentifierName
         |
        'v'

关于javascript - `AssignmentExpression`如何从EcmaScript语法中的 `Statement`导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46745654/

相关文章:

haskell - Haskell 中的谓词逻辑

javascript - ES6 类 Promise 链——访问 'this'

javascript - 如果输入有带有文本缩进的隐藏文本,jquery 滚动鼠标滚轮

javascript - 将 svg 元素放置在特定的位置方向

javascript - 如何用JS检测浏览器版本?

javascript - 为什么 Angular 使用 `import { SomeComponent } from ' some.component.ts '` instead of ` import SomeComponent from 'some.component.ts' `

javascript - 管理大型表单 - ReactJS

haskell - 在无状态世界中保持状态

c++ - LBNF、C函数声明/定义、reduce减少冲突

javascript - 区分浏览器刷新和浏览器关闭