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
但我不确定。这是对的吗?
我是这样找到它的:
AssignmentExpression
是 Expression:
的一部分
Expression :
AssignmentExpression
Expression, AssignmentExpression
那么 Expression
是 ExpressionStatement 的一部分是
ExpressionStatement:
[lookahead ∉ { {, function, ..., let [ }] Expression;
然后 ExpressionStatement
是 Statement 的一部分:
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'
假设我有以下部分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
,但可以出现在 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'