> Le 18 juin 2020 à 19:11, Hans Åberg <[email protected]> a écrit :
>
>
>> On 18 Jun 2020, at 18:56, Akim Demaille <[email protected]> wrote:
>>
>>> Le 18 juin 2020 à 14:54, Hans Åberg <[email protected]> a écrit :
>>>
>>> In my C++ parser, the lexer has rule
>>> . { return my_parser::token::token_error; }
>>>
>>> When it is triggers, I get the error:
>>> <file>:21.1: error: syntax error, unexpected token error
>>>
>>> It might be nicer to actually write out this token, though.
>>
>> I have already explained what I don't think this is a good idea.
>>
>> https://lists.gnu.org/r/help-bison/2020-06/msg00017.html
>>
>> I also have explained that scanner errors should be handled
>> by the scanner. For instance, in the bistro, you can read:
>>
>> int
>> yylex (const char **line, YYSTYPE *yylval, YYLTYPE *yylloc)
>> {
>> int c;
>>
>> [...]
>>
>> switch (c)
>> {
>> [...]
>> // Stray characters.
>> default:
>> yyerror (yylloc, "syntax error: invalid character: %c", c);
>> return TOK_YYerror;
>> }
>> }
>>
>> Cheers!
>
> Is that not the case, which I responded to, where you get double error
> messages, both from the lexer and parser?
No, that's the whole point of YYerror.
In the news of 3.6:
*** Returning the error token
When the scanner returns an invalid token or the undefined token
(YYUNDEF), the parser generates an error message and enters error
recovery. Because of that error message, most scanners that find lexical
errors generate an error message, and then ignore the invalid input
without entering the error-recovery.
The scanners may now return YYerror, the error token, to enter the
error-recovery mode without triggering an additional error message. See
the bistromathic for an example.