Re: [PATCH 3/4] java: add support for lookahead correction

Adrian Vogelsgesang via Bug fixes and other improvements to Bison <[email protected]>
Newsgroups gmane.comp.parsers.bison.patches
Message-ID <[email protected]>
Interesting…. Good that there was a test case for that! :)

From: Akim Demaille <[email protected]>
Date: Wednesday, 4. November 2020 at 07:17
To: Akim Demaille <[email protected]>
Cc: Adrian Vogelsgesang <[email protected]>, "[email protected]" <[email protected]>
Subject: Re: [PATCH 3/4] java: add support for lookahead correction

Hi Adrian,

> Le 2 nov. 2020 à 07:32, Akim Demaille <[email protected]> a écrit :
>
>> Le 2 nov. 2020 à 01:50, Adrian Vogelsgesang <[email protected]> a écrit :
>>
>> public ]b4_parser_class[(]b4_parse_param_decl([b4_lex_param_decl])[)]b4_maybe_throws([b4_init_throws])[
>> {
>> -]b4_percent_code_get([[init]])[
>> - this.yylexer = new YYLexer (]b4_lex_param_call[);
>> +]b4_percent_code_get([[init]])[]b4_lac_if([[
>> + this.yylacStack = new Vector<Integer>();
>> + this.yylacEstablished = false;]])[
>> + this.yylexer = new YYLexer(]b4_lex_param_call[);
>> ]b4_parse_param_cons[
>>
>>
>> Why do we place the user-provided init-code first?
>> Does that mean, the user must not call any methoes which might depend on `yylexer`?
>> Not sure if this actually matters, but I would put the user-provided init-code last, so that the rest of the class is already initialized…
>
> It makes sense, I'll change that. Thanks!

Well, it turns out that this was by design, to be able to call 'super'.
When I tried that change, the test suite failed:

> http://YYParser.java:294<http://YYParser.java:294> error: call to super must be first statement in constructor
> super("Test Thread"); if (true) throw new InterruptedException();
> ^


That's test 682, http://java.at:470<http://java.at:470>, Java constructor init and init_throws:

> m4_pushdef([AT_Witness],
> [super("Test Thread"); if (true) throw new InterruptedException();])
>
> AT_CHECK_JAVA_MINIMAL([[
> %define extends {Thread}
> %code init { ]AT_Witness[ }
> %define init_throws {InterruptedException}
> %lex-param {int lex_param}]])
> AT_CHECK([[grep ']AT_Witness[' YYParser.java]], 0, [ignore])

And it's documented:

> Use @code{%code init} for code added to the start of the constructor
> body. This is especially useful to initialize superclasses. Use
> @samp{%define init_throws} to specify any uncaught exceptions.


Cheers!
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.