help-bison
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Reporting malloc failure in actions


From: Akim Demaille
Subject: Re: Reporting malloc failure in actions
Date: Wed, 30 Dec 2020 07:48:18 +0100

Hi Joe,

> Le 29 déc. 2020 à 05:37, Joe Nelson <joe@begriffs.com> a écrit :
> 
> Hi, is there a recommended way to fail parsing when an action cannot
> allocate memory? I could use YYABORT, but the caller could mistake this
> for a problem in the input, when it's really an internal problem.

I never though about that.

> Looking at the generated foo.tab.c file for my parser, I see these
> macros:
> 
>       #define YYACCEPT        goto yyacceptlab
>       #define YYABORT         goto yyabortlab
>       #define YYERROR         goto yyerrorlab
> 
> Later in the file I see an interesting label that has no corresponding
> documented macro:
> 
>       /*-------------------------------------------------.
>       | yyexhaustedlab -- memory exhaustion comes here.  |
>       `-------------------------------------------------*/
>       yyexhaustedlab:
>         yyerror (scanner, callback, YY_("memory exhausted"));
>         yyresult = 2;
>         goto yyreturn;
> 
> This seems to be exactly the code I should execute, since it would
> inform the caller what went wrong. One option would be for my code to do
> something like this:
> 
>       if (!(bla = malloc(n)))
>               goto yyexhaustedlab;
> 
> I don't like relying on undocumented internals like this, since they're
> subject to change across versions of Bison. Any advice?

I guess most people just fail here, and don't even try to recover from
memory exhaustion.  Out of curiosity: do you really manage to keep your
program working after you've run out of memory?

I don't think this area (yyexhaustedlab) would change, but you are right
it is an internal detail.  I'll add something public in the future,
maybe YYNOMEM.  Any idea of a good spelling for such a macro?
YYEXHAUSTED doesn't sound right.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]