diff --git a/include/compiler/fzl_parser.h b/include/compiler/fzl_parser.h index 9788ee6..023ea0d 100644 --- a/include/compiler/fzl_parser.h +++ b/include/compiler/fzl_parser.h @@ -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); diff --git a/src/compiler/fzl_parser.c b/src/compiler/fzl_parser.c index 922b3ee..0c1bbe6 100644 --- a/src/compiler/fzl_parser.c +++ b/src/compiler/fzl_parser.c @@ -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) diff --git a/src/compiler/main.c b/src/compiler/main.c index 4bbea80..c53ef42 100644 --- a/src/compiler/main.c +++ b/src/compiler/main.c @@ -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;