<div dir="ltr"><span style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">Can anyone explain the reasoning behind the strange "leapfrogging" behavior of the<span class="inbox-inbox-Apple-converted-space"> </span></span><a href="https://tc39.github.io/ecma262/#prod-ExponentiationExpression" class="inbox-inbox-m_2504229942969595942cremed inbox-inbox-cremed cremed" target="_blank" style="font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">ExponentiationExpression</a><span style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"> and<span class="inbox-inbox-Apple-converted-space"> </span></span><a href="https://tc39.github.io/ecma262/#prod-UpdateExpression" class="inbox-inbox-m_2504229942969595942cremed inbox-inbox-cremed cremed" target="_blank" style="font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">UpdateExpression</a><span style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span class="inbox-inbox-Apple-converted-space"> </span>productions in the current spec?</span><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><br></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">Simplified relevant productions in operator precedence order are:</div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><br></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">ExponentiationExpression :</div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">    UnaryExpression</div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">    UpdateExpression ** ExponentiationExpression</div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><br></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">UnaryExpression :</div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">    UpdateExpression</div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">    { delete | void | typeof | + | - | ~ | ! } UnaryExpression</div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><div><br></div><div>UpdateExpression: </div></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">    { ++ | -- } UnaryExpression</div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">    LeftHandSideExpression { ++ | -- }</div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><br></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">Things that seem weird about this are:</div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">1. '-x ** y' is a syntax error, because UnaryExpression isn't allowed before **</div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">    You must write it as '(-x) ** y'</div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">    I would expect the production right hand side to be</div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">        UnaryExpression ** ExponentiationExpression</div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">    That avoids this strange syntax error and is consistent with the pattern followed by productions for lower-precedence operators.</div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><br></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">2. H<span style="line-height:1.5">aving UnaryExpression in the right hand side of UpdateExpression confuses precedence by going 'backward' to a lower-precedence non-terminal, and t</span><span style="line-height:1.5">he only production of UnaryExpression that generates a valid argument for '++'/'--' is UnaryExpression => UpdateExpression => LeftHandSideExpression anyway.</span></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><br></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">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?</div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><br></div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">Thanks,</div><div style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;font-size:13px">Bradford</div></div>