help-bison
[Top][All Lists]
Advanced

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

Re: Destructor trouble


From: Hans Yperman
Subject: Re: Destructor trouble
Date: Wed, 14 May 2003 14:20:23 +0200 (CEST)


Thanks, but that's not really the problem.  My problem is: how do
%destructor and YYERROR interact: If you have a rule that reduces b,c and
d to a, and the action of that rule calls YYERROR, are b,c and d already
reduced (and should i clean them myself) or are they still on the stack
(so the %destructor will take care of them for me).  And if i should clean
them myself, is there a way to call the bison destructor myself?

The basic idea of your program is (if I get it right) that you set a
variable to NULL if you destruct it.  That surely helps to detect if
something is destructed twice, but might give memory leaks in my case.

Greetings,

Hans.

On Tue, 13 May 2003, Andrew Chanler wrote:

> Howdy,
> im new to the help-bison mailing list and now exactly sure how to make
> a post but i hope this works!
>
> i thought i would give an example of how i was using the %destructor
> feature and a problem i ran into.
> heres a few lines of code:
> //////////////////////////////////////
> %union {
>       double double_val;
>       char* string_val;
> }
>
> %token <string_val> IDENTIFIER
> %type <double_val> exp
> %type <string_val> line
> %type <string_val> any_identifier
>
>
> %destructor {if($$){
>                       delete [] $$;
>                       $$=NULL;
>                       }
>               } IDENTIFIER any_identifier line
>
> %destructor { if((defining_func) &&(yyvaluep->string_val)) {
>                       delete [] yyvaluep->string_val;
>                       yyvaluep->string_val = NULL;
>                        }
>               } exp
>
> ////////////////////////////////
>
> now in my rules, every time i allocated memory for strings i used:
> $$ = new char[strlen + 1];
> when i set the flag defining_func to true, i always access exp as a
> string_val and allocate memory to it in the same way.
> as you can see, my destructor rule for 'exp' is kind of odd. above it,
> i declared exp as double_val type and that prevented me for accessing
> exp as string_val in the destructor. i thought that i should have been
> able to write my destructor rule for exp like this:
>
> %destructor { if((defining_func) && ($<string_val>$) {
>                       delete [] $<string_val>$;
>                       $<string_val>$ = NULL;
>                        }
>               } exp
>
> but bison did not like $<string_val>$ in the destructor code, so i went
> and loaded my output file(the .tab.c file) and found the line of code
> that was being used in the other destructor.
> and it was
> yyvaluep->string_val
> to access the string value.
> so i put that into my destructor rule for exp and then everything
> worked like a charm.
>
> i did this project in microsoft visual c++ and used its debugger to
> check for memory leaks.
> after i got those destructor rules working, all of my memory leaks were
> cleared up.
>
> but i thought it was pretty anouying that i couldn't access
> $<string_val>$ in the destructor rule.
>
> i hope this helps. %destructor is pretty simple. and i figured out how
> to use it with the bison 1.875 manual that comes with the the download
> of the binary.
>
> and im pretty new to all the bison/flex stuff(i have been
> studying/using it for half of this semester at college) so i hope i
> didn't do this incorrectly.
>
>
> Andrew Chanler
>
>
>
> --- Hans Yperman <address@hidden> wrote:
> >
> > Hello everyone,
> >
> > i have some trouble with understanding the %destructor feature: if I
> > have
> > a rule:
> >
> > %type<pointertype> a b c d
> > %destructor {do_something} pointertype
> >
> > a: b c d {
> >             if(trouble) YYERROR
> >     }
> >
> > Say b,c and d are pointers that should be freed.
> > If trouble happens, should i free b, c and d myself, or are they
> > cleaned
> > by  YYERROR?  And is it possible to call the destructor in the bison
> > code,
> > say with something like:
> >
> > if(trouble){ YYDESTRUCT(b); ...; YYERROR;}
> >
> > Also, if i write yyerror() so that it longjump()s out of the parser,
> > how
> > can i clean up the stack? This is an issue, as in my program,
> > yyerror()
> > is called by some other modules that also should clean up the stack
> > (e.g. error in the input stream or the lexer)
> >
> > Another issue:  I run both bison 1.35 (from Debian) and bison 1.875
> > (GNU).  The last one is so immensely slow compared by the first one,
> > spending almost 30 seconds running m4. Does someone know why?
> >
> > Oh, and one more thing.  The bison html documentation on the gnu site
> > is
> > not up-to-date.  I can't find anything about %destructor in it.  If
> > there
> > are syntax errors in my example, i'm sorry (But you get what i mean
> > with it, i guess).
> >
> > Thanks in advance,
> >
> > Hans.
> >
>
>
> __________________________________
> Do you Yahoo!?
> The New Yahoo! Search - Faster. Easier. Bingo.
> http://search.yahoo.com
>





reply via email to

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