feat: add AST freeing function
This commit is contained in:
@@ -56,6 +56,9 @@ char *fzl_parser_geterror();
|
|||||||
// Free node
|
// Free node
|
||||||
void fzl_freenode(fzl_node_t *node);
|
void fzl_freenode(fzl_node_t *node);
|
||||||
|
|
||||||
|
// Free entire AST going from root node
|
||||||
|
void fzl_freeast(fzl_node_t *root);
|
||||||
|
|
||||||
// Free parser
|
// Free parser
|
||||||
void fzl_freeparser(fzl_parser_t *parser);
|
void fzl_freeparser(fzl_parser_t *parser);
|
||||||
|
|
||||||
|
|||||||
@@ -210,11 +210,34 @@ void fzl_freenode(fzl_node_t *node)
|
|||||||
{
|
{
|
||||||
if (!node)
|
if (!node)
|
||||||
return;
|
return;
|
||||||
if (node->token)
|
|
||||||
fzl_freetoken(node->token);
|
|
||||||
free(node);
|
free(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void fzl_freeast(fzl_node_t *root)
|
||||||
|
{
|
||||||
|
if (!root)
|
||||||
|
return;
|
||||||
|
|
||||||
|
while (root)
|
||||||
|
{
|
||||||
|
if (root->type == FZL_NODETYPE_BLOCK)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < root->list.entry_count; i++)
|
||||||
|
if (root->list.entries[i])
|
||||||
|
fzl_freeast(root->list.entries[i]);
|
||||||
|
}
|
||||||
|
else if (root->type == FZL_NODETYPE_CALL)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < root->list.entry_count; i++)
|
||||||
|
if (root->list.entries[i])
|
||||||
|
fzl_freeast(root->list.entries[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
fzl_freenode(root);
|
||||||
|
root = root->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void fzl_freeparser(fzl_parser_t *parser)
|
void fzl_freeparser(fzl_parser_t *parser)
|
||||||
{
|
{
|
||||||
if (!parser)
|
if (!parser)
|
||||||
|
|||||||
@@ -160,6 +160,7 @@ int main(int argc, char **argv)
|
|||||||
free(args);
|
free(args);
|
||||||
fzl_freereader(rd);
|
fzl_freereader(rd);
|
||||||
fzl_freeparser(parser);
|
fzl_freeparser(parser);
|
||||||
|
fzl_freeast(parser->root);
|
||||||
|
|
||||||
printf("done.\n");
|
printf("done.\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user