Rename AST structures to Tree and relocate freeing logic
This commit is contained in:
+5
-43
@@ -3,7 +3,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
bool parse_module_declaration(Parser* p, Module* module) {
|
||||
bool parse_module_declaration(Parser* p, ModuleTree* module) {
|
||||
if (!parser_expect(p, TOKEN_MODULE, "expected keyword 'module'")) {
|
||||
return false;
|
||||
}
|
||||
@@ -16,13 +16,13 @@ bool parse_module_declaration(Parser* p, Module* module) {
|
||||
return parser_expect(p, TOKEN_SEMICOLON, "expected ';' after module name");
|
||||
}
|
||||
|
||||
Module* parser_parse(TokenStream* ts) {
|
||||
ModuleTree* parser_parse(TokenStream* ts) {
|
||||
Parser* p = malloc(sizeof(Parser));
|
||||
p->ts = ts;
|
||||
parser_next_token(p);
|
||||
|
||||
Module* module = malloc(sizeof(Module));
|
||||
memset(module, 0, sizeof(Module));
|
||||
ModuleTree* module = malloc(sizeof(ModuleTree));
|
||||
memset(module, 0, sizeof(ModuleTree));
|
||||
if (!parse_module_declaration(p, module)) {
|
||||
goto fail;
|
||||
}
|
||||
@@ -82,44 +82,6 @@ Module* parser_parse(TokenStream* ts) {
|
||||
return module;
|
||||
fail:
|
||||
free(p);
|
||||
parser_free(module);
|
||||
ast_free_module(module);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void parser_free(Module* module) {
|
||||
if (module == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (module->imports != NULL) {
|
||||
for(size_t i = 0; i < module->import_count; i++) {
|
||||
free(module->imports[i].module_name);
|
||||
}
|
||||
free(module->imports);
|
||||
}
|
||||
|
||||
if (module->aliases != NULL) {
|
||||
for(size_t i = 0; i < module->alias_count; i++) {
|
||||
free((void*)module->aliases[i].name);
|
||||
free_type_expression(&module->aliases[i].value);
|
||||
}
|
||||
free(module->aliases);
|
||||
}
|
||||
|
||||
if (module->variables != NULL) {
|
||||
for(size_t i = 0; i < module->variable_count; i++) {
|
||||
free(module->variables[i].name);
|
||||
free_type_expression(&module->variables[i].type);
|
||||
if (module->variables[i].initializer) {
|
||||
if (module->variables[i].initializer->tag == EXPRESSION_STRING) {
|
||||
free((void*)module->variables[i].initializer->string);
|
||||
}
|
||||
free(module->variables[i].initializer);
|
||||
}
|
||||
}
|
||||
free(module->variables);
|
||||
}
|
||||
|
||||
free(module->name);
|
||||
free(module);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user