On 5/24/2019 1:19 PM, Tagir Valeev wrote:
Hello! Answering myself
The first token in a YieldStatement production is always preceded
by one of these separator tokens: ;, {, }, ), or ->.
Seems I'm missing something. Could you please illustrate in which
case YieldStatement could be preceded by ')'?
Nevermind. if(foo) yield bar; is a good example. Other my points
still apply.
Also what about '->'? In lambda '->' is followed by an expression
or block, but not a statement. In switch '->' is followed by block,
throw or expression plus semicolon. Also could YieldStatement be
preceded by ':' in old switch format? E.g.
System.out.println(switch(0) { default: yield 1; }); // seems
legit
You're right that `->` should not appear in the list. Any `yield` which
follows `->` is necessarily the start of an expression, so `yield`
should be tokenized as an identifier there.
`:` is tricky. On the one hand, the space after `:` is sometimes
desirous of an statement, so tokenize `yield` as a keyword:
- `default : yield (1);` in a switch expression (also `case ... :`)
- `L1 : yield (1);` in a switch expression (labeled statements are
legitimate in a switch-labeled block! If there was no label, we would
quickly say that this `yield` is a YieldStatement not an
ExpressionStatement, and that if you want an ExpressionStatement which
invokes a method, then qualify the invocation.)
On the other hand, the space after `:` is sometimes desirous of an
expression, so tokenize `yield` as a identifier: (and it might be the
name of a local variable, so no way to qualify)
- `for (String s : yield . f) ...`
- `m(a ? yield . f : yield . g)`
Alex