如何从 EcmaScript 语法中的 `Statement` 派生 `AssignmentExpression`

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)

然后ExpressionExpressionStatement 的一部分是

ExpressionStatement:

    [lookahead ? { {, function, ..., let [ }] Expression;
Run Code Online (Sandbox Code Playgroud)

然后ExpressionStatementStatement 的一部分:

Statement :
    ExpressionStatement
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 5

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)

  • @AngularInDepth.com 赋值 -> Conditional -> LogicalOr -> LogicalAnd -> Bitwise(Or -> Xor -> And) -> Equality -> Relational -> Shift -> Add -> Mult -> Exponential -> Unary -> Update -> LHS -> 新建 -> 成员 -> 主要 -> 文字 -> 数字。 (3认同)
  • @AngularInDepth.com 这就是为什么我只写“...” ;-) 基本思想是规则按优先级排序,从最低优先级开始。然后,每个规则都使用具有次高优先级的规则作为其基本情况。因此,比如说,加法表达式是一个乘法表达式,后跟零个或多个加法运算符+操作数。因此,如果您想获得最低优先级规则(即主表达式),则必须遍历其间的所有其他运算符。 (2认同)