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 
re-compile.

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