Exponentiation operator precedence

Waldemar Horwat waldemar at google.com
Tue Aug 25 19:24:34 UTC 2015


On 08/25/2015 09:38, Claude Pache wrote:
>
> I think the following grammar could work.
> Replace the current (ES2015) PostfixExpression production with:
>
> ```
> IncrementExpression:
>      LeftHandSideExpression
>      LeftHandSideExpression [no LineTerminator here] ++
>      LeftHandSideExpression [no LineTerminator here] --
>      ++ LeftHandSideExpression
>      -- LeftHandSideExpression
> ```
>
> And define UnaryExpression as:
>
> ```
> UnaryExpression:
>      IncrementExpression
>      delete UnaryExpression
>      void UnaryExpression
>      typeof UnaryExpression
>      ++ UnaryExpression
>      + UnaryExpression
>      -- UnaryExpression
>      - UnaryExpression
>      ~ UnaryExpression
>      ! UnaryExpression
>      IncrementExpression ** UnaryExpression
> ```

The above is not a valid grammar.  For example, parsing ++x leads to a reduce-reduce conflict, where the ++ can come from either a UnaryExpression or an IncrementExpression.

> where the following production (which exists only to avoid to confusingly interpret, e.g., `++x++` as `+ +x++`):

That makes no sense.  ++ is a lexical token.  The lexer always greedily bites off the largest token it can find, even if that leads to a parser error later.  The parser does not backtrack into the lexer to look for alternate lexings.  For example,

   x +++++ y;

is a syntax error because it's greedily lexed as:

   x ++ ++ + y;

The parser does not backtrack into the lexer to look for other possible lexings such as:

   x ++ + ++ y;


> ```
> UnaryExpression:
>      ++ UnaryExpression
>      -- UnaryExpression
> ```
>
> yields a static SyntaxError (or a static ReferenceError if we want to be 100% compatible ES2015).

This is a problem.  It makes ++x into a static SyntaxError because x is a UnaryExpression.

If you got rid of these two ++ and -- productions in UnaryExpression, that would solve that problem (and I think make the grammar valid).

     Waldemar



More information about the es-discuss mailing list