Max*_*kyi 3 javascript compiler-construction context-free-grammar ecmascript-6
假设我有以下 JS 代码部分:
const v = 3;
Run Code Online (Sandbox Code Playgroud)
据我了解,它可以解析为AssignmentExpression:
AssignmentExpression :
LeftHandSideExpression = AssignmentExpression
Run Code Online (Sandbox Code Playgroud)
现在我想知道它是如何从Statement派生出来的?一种可能的途径是:
Statement -> ExpressionStatement -> Expression -> AssignmentExpression
Run Code Online (Sandbox Code Playgroud)
但我不确定。这是正确的吗?
这是我找到它的方法:
AssignmentExpression是部分表达式:
Expression :
AssignmentExpression
Expression, AssignmentExpression
Run Code Online (Sandbox Code Playgroud)
然后Expression是ExpressionStatement 的一部分是
ExpressionStatement:
[lookahead ? { {, function, ..., let [ }] Expression;
Run Code Online (Sandbox Code Playgroud)
然后ExpressionStatement是Statement 的一部分:
Statement :
ExpressionStatement
Run Code Online (Sandbox Code Playgroud)
const v = 3;是声明,而不是赋值。有趣的是,声明不是Statements,但可以出现在StatementLists 中。所以你不能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'
Run Code Online (Sandbox Code Playgroud)
实际分配将只是v = 5;. 这将通过ExpressionStatement,从的派生Statement将如下所示:
Statement
|
ExpressionStatement
/ \
Expression ';'
|
AssignmentExpression
/ | \
LeftHandSideExpression '=' AssignmentExpression
| |
NewExpression ...
| |
MemberExpression '5'
|
PrimaryExpression
|
IdentifierReference
|
Identifier
|
IdentifierName
|
'v'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
324 次 |
| 最近记录: |