假设我有以下 JS 代码部分:
const v = 3;
据我了解,它可以解析为 AssignmentExpression :
AssignmentExpression :
LeftHandSideExpression = AssignmentExpression
现在我想知道它是如何从 Statement 派生出来的。 ?一种可能的路线是:
Statement -> ExpressionStatement -> Expression -> AssignmentExpression
但我不确定。这是对的吗?
这是我找到它的方法:
AssignmentExpression
是部分 Expression :Expression :
AssignmentExpression
Expression, AssignmentExpression
然后
Expression
是 ExpressionStatement 的一部分是ExpressionStatement:
[lookahead ∉ { {, function, ..., let [ }] Expression;
然后
ExpressionStatement
是 Statement 的一部分: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/