Проверка последнего стандарта для 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 без скобок из выражения Expression в UpdateExpression для подачи в UnaryExpression.
Или это просто -x ** y запрещено, и вы должны получить явное значение, используя
- (x ** y)
или
(- x) ** y
, оба из которых легко проанализировать следующим образом:
(x ** y) является ParenthesizedExpression, поэтому передается в UnaryExpression как PrimaryExpression.
(- x) аналогично передается в UpdateExpression как PrimaryExpression
Или мне не хватает чего-то очевидного.