【发布时间】: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