ECMAScript 2020 Exponentiation Grammar беспорядок - PullRequest
2 голосов
/ 17 июня 2020

Проверка последнего стандарта для 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

Или мне не хватает чего-то очевидного.

1 Ответ

1 голос
/ 17 июня 2020

Или просто -x ** y запрещен, и вы должны получить явное значение, используя

-(x ** y)

или

(-x) ** y

Точно.

Или мне не хватает чего-то очевидного.

Нет, вы все поняли.

В этом ответе есть несколько полезных ссылок связанный вопрос из 2017 , включая эту цепочку писем, начатую Бренданом Эйхом в списке обсуждений в 2015 году, в котором предлагается текущий синтаксис.

Некоторые конкретные примеры:

С консоли Firefox:

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

Из Дэвида Фланагана «JavaScript: Полное руководство» (О'Рейли) (не одобрение):

Такие выражения, как -3 ** 2, имеют естественную двусмысленность. В зависимости от относительного приоритета унарного минуса и возведения в степень это выражение может означать (-3)**2 или -(3**2). Разные языки обрабатывают это по-разному, и вместо того, чтобы выбирать стороны, JavaScript просто делает синтаксической ошибкой опускание скобок в этом случае, вынуждая вас написать однозначное выражение.

Полное руководство - это грамматика, которую вы уже цитировали.

...