【问题标题】:ECMAScript 2020 Exponentiation Grammar confusionECMAScript 2020 求幂语法混淆
【发布时间】:2020-06-17 12:59:08
【问题描述】:

检查 ECMA-262 ECMAScript 2020(或第 11 版)的最新标准,但无法找出求幂的语法产生式。

UpdateExpression[Yield, Await]:
 LeftHandSideExpression[?Yield, ?Await]
 LeftHandSideExpression[?Yield, ?Await][no LineTerminator here]++
 LeftHandSideExpression[?Yield, ?Await][no LineTerminator here]--
 ++UnaryExpression[?Yield, ?Await]
 --UnaryExpression[?Yield, ?Await]

UnaryExpression[Yield, Await]:
 UpdateExpression[?Yield, ?Await]
 delete UnaryExpression[?Yield, ?Await]
 void UnaryExpression[?Yield, ?Await]
 typeof UnaryExpression[?Yield, ?Await]
 +UnaryExpression[?Yield, ?Await]
 -UnaryExpression[?Yield, ?Await]
 ~UnaryExpression[?Yield, ?Await]
 !UnaryExpression[?Yield, ?Await]
 [+Await]AwaitExpression[?Yield]

ExponentiationExpression[Yield, Await]:
 UnaryExpression[?Yield, ?Await]
 UpdateExpression[?Yield, ?Await]**ExponentiationExpression[?Yield, ?Await]

所以 UnaryExpression 是 ExponentiationExpression 因此允许类似 -x 的东西向上传递解析树,但要实际评估 LHS 必须是 UpdateExpression(++x、--x、x++、x-- 或只是X)。 RHS 是 ExponentiationExpression,因此可以是 UnaryExpression。这意味着解析 x ** -y 很容易,但是如何解析 -x ** y。我想把它当作 -(x ** y) 处理,但没有办法让未加括号的 x ** y 从表达式返回到 UpdateExpression 以输入 UnaryExpression。

或者仅仅是 -x ** y 是不允许的,你必须通过使用来明确

-(x ** y)

或

(-x) ** 是的

,这两个都很容易解析如下:

(x ** y) 是一个括号表达式,因此作为 PrimaryExpression 输入到 UnaryExpression。

(-x) 类似地作为 PrimaryExpression 输入 UpdateExpression

还是我遗漏了一些明显的东西。

【问题讨论】:

    标签: javascript grammar


    【解决方案1】:

    或者仅仅是 -x ** y 是不允许的,你必须通过使用来明确

    -(x ** y)
    

    或

    (-x) ** y
    

    没错。

    还是我遗漏了一些明显的东西。

    不,你没看错。

    this answer to a related question from 2017中有一些有用的链接,包括2015年es-discuss列表中的this email thread started by Brendan Eich,它提出了当前的语法。

    一些具体的例子:

    从 Firefox 控制台:

    -2**4
    SyntaxError: unparenthesized unary expression can't appear on the left-hand side of '**'
    

    来自David Flanagan's "JavaScript: The Definitive Guide"(O'Reilly)(非代言):

    -3 ** 2 之类的表达式自然会产生歧义。根据一元减号和幂的相对优先级,该表达式可能表示(-3)**2 或-(3**2)。不同的语言以不同的方式处理这个问题,而不是选择立场,JavaScript 在这种情况下只是将省略括号作为语法错误,迫使您编写一个明确的表达式。

    当然,真正权威的指南是你已经引用过的语法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多