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!
