如何`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
然后Expression
是ExpressionStatement部分
ExpressionStatement:
[lookahead ∉ { {, function, ..., let [ }] Expression;
,然后ExpressionStatement
是Statement部分:
Statement :
ExpressionStatement
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;
。这将经历ExpressionStatement
和Statement
推导是这样的:
Statement
|
ExpressionStatement
/ \
Expression ';'
|
AssignmentExpression
/ | \
LeftHandSideExpression '=' AssignmentExpression
| |
NewExpression ...
| |
MemberExpression '5'
|
PrimaryExpression
|
IdentifierReference
|
Identifier
|
IdentifierName
|
'v'
这真了不起。 – Pointy
再次感谢这样一个精心制作的答案! –
我冒昧地添加了图中缺少的'MemberExpression'。这张图非常有帮助。我想知道这些树点是什么“......”? –
第一:'常量V = 3;'是不是** **赋值表达式。这是一个'const'声明。初始化部分*看起来像一个赋值表达式,但它是语法的一个独立部分。 – Pointy
JavaScript语法在很大程度上依赖于语法结构开始处的关键字和标记,而声明就是一个很好的例子。如果语句中的第一个标记是'const'或'let'或'var',那么它是一个声明,而不是一个表达式语句。 – Pointy
@Pointy,谢谢你指出。你所说的Const声明似乎是“LexicalDeclaration:LetOrConst BindingList”的一部分。如果我现在遵循语法,那么我应该使用这些派生语句:StatementListItem - >声明 - > LexicalDeclaration。你能把它作为答案发布吗? –