Related articles |
---|
Memory leaks upon error recovery in Yacc davidpereira@home.com (David Pereira) (2000-11-18) |
Re: Memory leaks upon error recovery in Yacc timur@lantel.ru (Timur Safin) (2000-12-01) |
Re: Memory leaks upon error recovery in Yacc hannah@mamba.pond.sub.org (2000-12-18) |
Re: Memory leaks upon error recovery in Yacc kapland@starfleet.com (2000-12-18) |
From: | "David Pereira" <davidpereira@home.com> |
Newsgroups: | comp.compilers |
Date: | 18 Nov 2000 00:55:16 -0500 |
Organization: | Excite@Home - The Leader in Broadband http://home.com/faster |
Keywords: | yacc, errors |
Posted-Date: | 18 Nov 2000 00:55:16 EST |
I am building a syntax tree with Bison, using the following
method. For example,
...
...
expr: expr '+' expr { $$=malloc(sizeof (binary_node_t));
$$->left = $1; $$->right =$2; $$->op = PLUS; }
..
..
| NUM { $$=malloc(struct (int_node_t)); }
...
...
Plain and simple. Just a tree of allocated nodes.
The problem is error productions. When an error occurs, the yacc/bison
parser pops state/semantic-value pairs off the top of the stack until it
reaches a state whose underlying set of items contains the error keyword.
(No problem here, this is standard yacc style error recovery). This
introduces a problem, however, because those semantic values popped off the
stack, can contain pointers to subtrees, that would have been integrated
into a bigger subtree, had the parse gone smoothly at that level. Therefore,
I have memory leaks and I would like to deallocate those subtrees. One
solution is to wrap malloc () with something like FOOMALLOC () that adds the
pointer to every node it allocates into a list. That way, at the END of the
parse I can blow away all nodes in that list that are not part of the syntax
tree. BUT, I want to do this memory reclamation RIGHT AFTER each error
production has kicked in (I don't want to wait till the parse has finished).
DP
[You can try to free memory by using error rules to avoid the implicit
pops, but this is definitely one of yacc's weaker areas. -John]
Return to the
comp.compilers page.
Search the
comp.compilers archives again.