如何`AssignmentExpression`从`Statement`中的EcmaScript语法派生

问题描述:

假设我有JS代码如下部分:如何`AssignmentExpression`从`Statement`中的EcmaScript语法派生

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 
+3

第一:'常量V = 3;'是不是** **赋值表达式。这是一个'const'声明。初始化部分*看起来像一个赋值表达式,但它是语法的一个独立部分。 – Pointy

+1

JavaScript语法在很大程度上依赖于语法结构开始处的关键字和标记,而声明就是一个很好的例子。如果语句中的第一个标记是'const'或'let'或'var',那么它是一个声明,而不是一个表达式语句。 – Pointy

+0

@Pointy,谢谢你指出。你所说的Const声明似乎是“LexicalDeclaration:LetOrConst BindingList”的一部分。如果我现在遵循语法,那么我应该使用这些派生语句:StatementListItem - >声明 - > LexicalDeclaration。你能把它作为答案发布吗? –

const v = 3;是一个声明,而不是一个赋值。有趣的是,声明不是Statement s,但可以出现在StatementList s中。所以你不能从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;。这将经历ExpressionStatementStatement推导是这样的:

     Statement 
         | 
       ExpressionStatement 
        /  \ 
        Expression ';' 
         | 
       AssignmentExpression 
      /  |   \ 
LeftHandSideExpression '=' AssignmentExpression 
     |       | 
    NewExpression    ... 
     |       | 
    MemberExpression    '5' 
     | 
    PrimaryExpression    
     | 
IdentifierReference 
     | 
    Identifier 
     | 
    IdentifierName 
     | 
     'v' 
+0

这真了不起。 – Pointy

+0

再次感谢这样一个精心制作的答案! –

+0

我冒昧地添加了图中缺少的'MemberExpression'。这张图非常有帮助。我想知道这些树点是什么“......”? –