EcmaScript 语法中如何从 Statement 派生出 AssignmentExpression

How can `AssignmentExpression` be derived from `Statement` in EcmaScript grammar

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

const v = 3;

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

AssignmentExpression :
    LeftHandSideExpression = AssignmentExpression

现在我想知道如何从 Statement 中导出它?一种可能的路线是:

Statement -> ExpressionStatement -> Expression -> AssignmentExpression

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

我是这样找到它的:

AssignmentExpressionExpression:

的一部分
Expression :
    AssignmentExpression
    Expression, AssignmentExpression

那么 ExpressionExpressionStatement 的一部分是

ExpressionStatement:

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

然后 ExpressionStatementStatement 的一部分:

Statement :
    ExpressionStatement

const v = 3; 是声明,不是赋值。有趣的是,声明不是 Statement,但可以出现在 StatementList 中。所以你不能从Statement推导出const v = 3;,但是你可以从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'