Hi Tagir,

On 1/11/2019 5:32 AM, Tagir Valeev wrote:
On the other hand, from IDE developer point of view, having expression
and statement with so similar syntax definitely adds a confusion to
the parsing (and probably to users). E.g. suppose we want to parse a
fragment which consists of a number of statements, isolated from other
code:

switch(0) { default -> throw new Exception(); };

In normal context it's two statements: switch-statement followed by an
empty statement. However inside switch expression rule it's one
statement: an expression statement containing a switch expression:

int x = switch(0) { default -> switch(0) { default -> throw new
Exception(); }; };

Normally if we take a textual representation of single statement, it
could be parsed back into the same single statement, when isolated
from other code (the same works for expressions). Here this rule is
violated: the expression statement taken from switch expression rule
could be reparsed in isolation as two statements.

I'm concerned about any claim of ambiguity in the grammar, though I'm not sure I'm following you correctly. I agree that your first fragment is parsed as two statements -- a switch statement and an empty statement -- but I don't know what you mean about "inside switch expression rule" for your second fragment. A switch expression is not an expression statement (JLS 14.8). In your second fragment, the leftmost default label is followed not by a block or a throw statement but by an expression (`switch (0) {...}`, a unary expression) and a semicolon. Yes, the phrase `switch (0) {...}` is parsed as a switch statement in one context and as a unary expression in another context. Is that the ambiguity you wished to highlight?

Alex

Reply via email to