feat: add AST freeing function
This commit is contained in:
@@ -56,6 +56,9 @@ char *fzl_parser_geterror();
|
||||
// Free node
|
||||
void fzl_freenode(fzl_node_t *node);
|
||||
|
||||
// Free entire AST going from root node
|
||||
void fzl_freeast(fzl_node_t *root);
|
||||
|
||||
// Free parser
|
||||
void fzl_freeparser(fzl_parser_t *parser);
|
||||
|
||||
|
||||
@@ -210,11 +210,34 @@ void fzl_freenode(fzl_node_t *node)
|
||||
{
|
||||
if (!node)
|
||||
return;
|
||||
if (node->token)
|
||||
fzl_freetoken(node->token);
|
||||
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)
|
||||
{
|
||||
if (!parser)
|
||||
|
||||
@@ -160,6 +160,7 @@ int main(int argc, char **argv)
|
||||
free(args);
|
||||
fzl_freereader(rd);
|
||||
fzl_freeparser(parser);
|
||||
fzl_freeast(parser->root);
|
||||
|
||||
printf("done.\n");
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user