Yield as contextual keyword

Peter Levart peter.levart at gmail.com
Wed May 29 16:15:34 UTC 2019

Even in expression context, unqualified yield could be tokenized as 
keyword (and hence produce a compile-time error). What do we loose? If 
it is a field, it can be qualified. If it is a local variable, it only 
presents source incompatibility, which can easily be fixed at next 

The treatment would be more regular (not dependent on expression vs. 
statement context) this way.

Regards, Peter

On 5/29/19 4:21 PM, Gavin Bierman wrote:
> Upon reflection, the simplest way out of this is to not go down the 
> path of trying to identify tokens so that the lexer knows something 
> about parsing, but rather follow the suggestion made by Dan earlier in 
> this thread. To wit, we treat `yield` much like we treat `var`. It’s a 
> "restricted identifier", which means that it can’t be used as a 
> *TypeIdentifier* nor as a *MethodName*. Thus any unqualified method 
> invocation needs to be qualified (or in the extreme corner case 
> involving an anonymous class spotted by Tagir, may need (local) 
> renaming). Without qualification, `yield (42);` will be *parsed* as a 
> `yield` statement and not an expression statement. Our corpus 
> analysis, as reported by Brian, shows this not to be a problem. 
> Tagir’s analysis of the Idea Ultimate sources suggests the same.
> The revised JLS is available at: 
> http://cr.openjdk.java.net/~gbierman/jep354-jls-20190528.html
> Thanks,
> Gavin
>> On 24 May 2019, at 23:44, Alex Buckley <alex.buckley at oracle.com 
>> <mailto:alex.buckley at oracle.com>> wrote:
>> 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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/amber-spec-experts/attachments/20190529/cdddb55d/attachment-0001.html>

More information about the amber-spec-experts mailing list