如何从EcmaScript语法中的"Statement"派生"AssignmentExpr



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

const v = 3;

据我所知,它可以解析为AssignmentExpression:

AssignmentExpression :
LeftHandSideExpression = AssignmentExpression

现在我想知道它是如何从语句中派生出来的?一种可能的途径是:

Statement -> ExpressionStatement -> Expression -> AssignmentExpression

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

以下是我的发现:

AssignmentExpression是部分表达式:

Expression :
AssignmentExpression
Expression, AssignmentExpression

Expression是表达式的一部分语句是

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

然后ExpressionStatement是Statement:的一部分

Statement :
ExpressionStatement

const v = 3;是一个声明,而不是赋值。有趣的是,声明不是Statements,但可以出现在StatementLists中。因此,不能从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'

最新更新