Reason for strange ExponentiationExpression & UpdateExpression productions?
Kevin Smith
zenparsing at gmail.com
Wed Jul 20 20:04:29 UTC 2016
It's pretty weird.
On Wed, Jul 20, 2016 at 3:55 PM Jordan Harband <ljharb at gmail.com> wrote:
> `-x ** y` is absolutely a SyntaxError because of the disagreement between
> many programming languages which treat that as `(-x) ** y` and math itself
> which treats it as `-(x ** y)`.
>
> To resolve the debate about "what will users expect", this early syntax
> error ensures that programmers get the joy of being required to be explicit
> about their precedence, saving countless amounts of time and money spent on
> linting rules and style arguments.
>
> On Wed, Jul 20, 2016 at 12:48 PM, Bradford Smith <
> bradfordcsmith at google.com> wrote:
>
>> Can anyone explain the reasoning behind the strange "leapfrogging"
>> behavior of the ExponentiationExpression
>> <https://tc39.github.io/ecma262/#prod-ExponentiationExpression> and
>> UpdateExpression <https://tc39.github.io/ecma262/#prod-UpdateExpression> productions
>> in the current spec?
>>
>> Simplified relevant productions in operator precedence order are:
>>
>> ExponentiationExpression :
>> UnaryExpression
>> UpdateExpression ** ExponentiationExpression
>>
>> UnaryExpression :
>> UpdateExpression
>> { delete | void | typeof | + | - | ~ | ! } UnaryExpression
>>
>> UpdateExpression:
>> { ++ | -- } UnaryExpression
>> LeftHandSideExpression { ++ | -- }
>>
>> Things that seem weird about this are:
>> 1. '-x ** y' is a syntax error, because UnaryExpression isn't allowed
>> before **
>> You must write it as '(-x) ** y'
>> I would expect the production right hand side to be
>> UnaryExpression ** ExponentiationExpression
>> That avoids this strange syntax error and is consistent with the
>> pattern followed by productions for lower-precedence operators.
>>
>> 2. Having UnaryExpression in the right hand side of UpdateExpression
>> confuses precedence by going 'backward' to a lower-precedence non-terminal,
>> and the only production of UnaryExpression that generates a valid
>> argument for '++'/'--' is UnaryExpression => UpdateExpression =>
>> LeftHandSideExpression anyway.
>>
>> I've just finished implementing these rules in the closure-compiler,
>> where I had to implement logic to deal with this strange behavior. Is it at
>> all possible that these are simply typos in the spec?
>>
>> Thanks,
>> Bradford
>>
>> _______________________________________________
>> es-discuss mailing list
>> es-discuss at mozilla.org
>> https://mail.mozilla.org/listinfo/es-discuss
>>
>>
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20160720/8aa26649/attachment-0001.html>
More information about the es-discuss
mailing list