diff --git a/README.md b/README.md index 30c95f2..c8e7321 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,8 @@ This is the main repository for Colgm compiler. ## Repo Content -- [bootstrap](./bootstrap/README.md): still under development -- [src](./src/README.md): for bootstrapped compiler, not available now +- [bootstrap](./bootstrap/README.md) : available now +- [src](./src/README.md) : for bootstrapped compiler, not available now ## Bootstrapping Compiler diff --git a/src/README.md b/src/README.md index 43e9e22..ab78ec7 100644 --- a/src/README.md +++ b/src/README.md @@ -1,6 +1,6 @@ # Colgm Compiler -Work in progress. +Work in progress. Lexer and parser are done. ## Build diff --git a/src/ast/ast.colgm b/src/ast/ast.colgm index a116f84..26c4e49 100644 --- a/src/ast/ast.colgm +++ b/src/ast/ast.colgm @@ -99,9 +99,160 @@ impl ast { } func delete(self) { - io::stderr().out("free ast ").out_i64(self => i64).endln(); self->location->delete(); free(self->location => i8*); + + match (self->kind) { + ast_kind::ast_null => return; + ast_kind::ast_root => { + var tmp = self => root*; + tmp->delete(); + } + ast_kind::ast_unary_operator => { + var tmp = self => ast_unary_operator*; + tmp->delete(); + } + ast_kind::ast_binary_operator => { + var tmp = self => ast_binary_operator*; + tmp->delete(); + } + ast_kind::ast_type_convert => { + var tmp = self => ast_type_convert*; + tmp->delete(); + } + ast_kind::ast_identifier => { + var tmp = self => ast_identifier*; + tmp->delete(); + } + ast_kind::ast_nil_literal => return; + ast_kind::ast_number_literal => { + var tmp = self => ast_number_literal*; + tmp->delete(); + } + ast_kind::ast_string_literal => { + var tmp = self => ast_string_literal*; + tmp->delete(); + } + ast_kind::ast_char_literal => { + var tmp = self => ast_char_literal*; + tmp->delete(); + } + ast_kind::ast_bool_literal => return; + ast_kind::ast_call_index => { + var tmp = self => ast_call_index*; + tmp->delete(); + } + ast_kind::ast_call_func_args => { + var tmp = self => ast_call_func_args*; + tmp->delete(); + } + ast_kind::ast_get_field => { + var tmp = self => ast_get_field*; + tmp->delete(); + } + ast_kind::ast_init_pair => { + var tmp = self => ast_init_pair*; + tmp->delete(); + } + ast_kind::ast_initializer => { + var tmp = self => ast_initializer*; + tmp->delete(); + } + ast_kind::ast_call_path => { + var tmp = self => ast_call_path*; + tmp->delete(); + } + ast_kind::ast_call => { + var tmp = self => ast_call*; + tmp->delete(); + } + ast_kind::ast_assignment => { + var tmp = self => ast_assignment*; + tmp->delete(); + } + ast_kind::ast_type_def => { + var tmp = self => ast_type_def*; + tmp->delete(); + } + ast_kind::ast_enum_member => { + var tmp = self => ast_enum_member*; + tmp->delete(); + } + ast_kind::ast_enum_decl => { + var tmp = self => ast_enum_decl*; + tmp->delete(); + } + ast_kind::ast_struct_field => { + var tmp = self =>ast_struct_field*; + tmp->delete(); + } + ast_kind::ast_struct_decl => { + var tmp = self => ast_struct_decl*; + tmp->delete(); + } + ast_kind::ast_param => { + var tmp = self => ast_param*; + tmp->delete(); + } + ast_kind::ast_param_list => { + var tmp = self => ast_param_list*; + tmp->delete(); + } + ast_kind::ast_func_decl => { + var tmp = self => ast_func_decl*; + tmp->delete(); + } + ast_kind::ast_impl => { + var tmp = self => ast_impl*; + tmp->delete(); + } + ast_kind::ast_use_stmt => { + var tmp = self => ast_use_stmt*; + tmp->delete(); + } + ast_kind::ast_definition => { + var tmp = self => ast_definition*; + tmp->delete(); + } + ast_kind::ast_cond_stmt => { + var tmp = self => ast_cond_stmt*; + tmp->delete(); + } + ast_kind::ast_if_stmt => { + var tmp = self => ast_if_stmt*; + tmp->delete(); + } + ast_kind::ast_match_case => { + var tmp = self => ast_match_case*; + tmp->delete(); + } + ast_kind::ast_match_stmt => { + var tmp = self => ast_match_stmt*; + tmp->delete(); + } + ast_kind::ast_while_stmt => { + var tmp = self => ast_while_stmt*; + tmp->delete(); + } + ast_kind::ast_for_stmt => { + var tmp = self => ast_for_stmt*; + tmp->delete(); + } + ast_kind::ast_in_stmt_expr => { + var tmp = self => ast_in_stmt_expr*; + tmp->delete(); + } + ast_kind::ast_ret_stmt => { + var tmp = self => ast_ret_stmt*; + tmp->delete(); + } + ast_kind::ast_continue_stmt => return; + ast_kind::ast_break_stmt => return; + ast_kind::ast_code_block => { + var tmp = self => ast_code_block*; + tmp->delete(); + } + } } } @@ -120,13 +271,14 @@ impl ptr_vec { } func delete(self) { - self->size = 0 => u64; - self->capacity = 0 => u64; for (var i = 0 => u64; i < self->size; i += 1 => u64) { self->data[i]->delete(); free(self->data[i] => i8*); } free(self->data => i8*); + self->size = 0 => u64; + self->capacity = 0 => u64; + self->data = nil => ast**; } func expand(self) { @@ -168,10 +320,6 @@ impl ast_null { var res = ast_null::__alloc__(); return res; } - - func delete(self) { - self->base.delete(); - } } struct root { @@ -190,7 +338,6 @@ impl root { } func delete(self) { - self->base.delete(); self->imports.delete(); self->decls.delete(); } @@ -214,7 +361,6 @@ impl ast_unary_operator { } func delete(self) { - self->base.delete(); if (self->value => i8* != nil) { self->value->delete(); } @@ -239,7 +385,6 @@ impl ast_binary_operator { } func delete(self) { - self->base.delete(); if (self->left => i8* != nil) { self->left->delete(); } @@ -265,7 +410,6 @@ impl ast_type_convert { } func delete(self) { - self->base.delete(); if (self->from => i8* != nil) { self->from->delete(); } @@ -289,7 +433,6 @@ impl ast_identifier { } func delete(self) { - self->base.delete(); self->name.delete(); } } @@ -304,10 +447,6 @@ impl ast_nil_literal { res->base = ast::instance(ast_kind::ast_nil_literal, loc); return res; } - - func delete(self) { - self->base.delete(); - } } struct ast_number_literal { @@ -324,7 +463,6 @@ impl ast_number_literal { } func delete(self) { - self->base.delete(); self->literal.delete(); } } @@ -343,7 +481,6 @@ impl ast_string_literal { } func delete(self) { - self->base.delete(); self->literal.delete(); } } @@ -362,7 +499,6 @@ impl ast_char_literal { } func delete(self) { - self->base.delete(); self->literal.delete(); } } @@ -379,10 +515,6 @@ impl ast_bool_literal { res->flag = flag; return res; } - - func delete(self) { - self->base.delete(); - } } struct ast_call_index { @@ -399,7 +531,6 @@ impl ast_call_index { } func delete(self) { - self->base.delete(); if (self->index => i8* != nil) { self->index->delete(); } @@ -420,7 +551,6 @@ impl ast_call_func_args { } func delete(self) { - self->base.delete(); self->args.delete(); } } @@ -439,7 +569,6 @@ impl ast_get_field { } func delete(self) { - self->base.delete(); self->name.delete(); } } @@ -458,7 +587,6 @@ impl ast_ptr_get_field { } func delete(self) { - self->base.delete(); self->name.delete(); } } @@ -479,7 +607,6 @@ impl ast_init_pair { } func delete(self) { - self->base.delete(); if (self->field => i8* != nil) { self->field->delete(); } @@ -503,7 +630,6 @@ impl ast_initializer { } func delete(self) { - self->base.delete(); self->pairs.delete(); } } @@ -522,7 +648,6 @@ impl ast_call_path { } func delete(self) { - self->base.delete(); self->name.delete(); } } @@ -543,7 +668,6 @@ impl ast_call { } func delete(self) { - self->base.delete(); if(self->head => i8* != nil) { self->head->delete(); } @@ -568,7 +692,6 @@ impl ast_assignment { } func delete(self) { - self->base.delete(); if (self->left => i8* != nil) { self->left->delete(); } @@ -596,7 +719,6 @@ impl ast_type_def { } func delete(self) { - self->base.delete(); if (self->name => i8* != nil) { self->name->delete(); } @@ -619,7 +741,6 @@ impl ast_enum_member { } func delete(self) { - self->base.delete(); if (self->name => i8* != nil) { self->name->delete(); } @@ -645,7 +766,6 @@ impl ast_enum_decl { } func delete(self) { - self->base.delete(); self->members.delete(); self->name.delete(); } @@ -667,7 +787,6 @@ impl ast_struct_field { } func delete(self) { - self->base.delete(); if (self->name => i8* != nil) { self->name->delete(); } @@ -693,7 +812,6 @@ impl ast_struct_decl { } func delete(self) { - self->base.delete(); self->fields.delete(); self->name.delete(); } @@ -715,7 +833,6 @@ impl ast_param { } func delete(self) { - self->base.delete(); if (self->name => i8* != nil) { self->name->delete(); } @@ -739,7 +856,6 @@ impl ast_param_list { } func delete(self) { - self->base.delete(); self->params.delete(); } } @@ -764,7 +880,6 @@ impl ast_func_decl { } func delete(self) { - self->base.delete(); self->name.delete(); if (self->params => i8* != nil) { self->params->delete(); @@ -794,8 +909,8 @@ impl ast_impl { } func delete(self) { - self->base.delete(); self->name.delete(); + self->methods.delete(); } } @@ -815,6 +930,11 @@ impl ast_use_stmt { res->import_symbol.init(); return res; } + + func delete(self) { + self->module_path.delete(); + self->import_symbol.delete(); + } } struct ast_definition { @@ -835,7 +955,6 @@ impl ast_definition { } func delete(self) { - self->base.delete(); self->name.delete(); if (self->type => i8* != nil) { self->type->delete(); @@ -860,7 +979,6 @@ impl ast_cond_stmt { } func delete(self) { - self->base.delete(); self->stmts.delete(); } } @@ -881,7 +999,6 @@ impl ast_if_stmt { } func delete(self) { - self->base.delete(); if (self->condition => i8* != nil) { self->condition->delete(); } @@ -907,7 +1024,6 @@ impl ast_match_case { } func delete(self) { - self->base.delete(); if (self->pattern => i8* != nil) { self->pattern->delete(); } @@ -933,7 +1049,6 @@ impl ast_match_stmt { } func delete(self) { - self->base.delete(); self->value->delete(); self->cases.delete(); } @@ -955,7 +1070,6 @@ impl ast_while_stmt { } func delete(self) { - self->base.delete(); if (self->condition => i8* != nil) { self->condition->delete(); } @@ -985,7 +1099,6 @@ impl ast_for_stmt { } func delete(self) { - self->base.delete(); if (self->init => i8* != nil) { self->init->delete(); } @@ -1015,7 +1128,6 @@ impl ast_in_stmt_expr { } func delete(self) { - self->base.delete(); if (self->value => i8* != nil) { self->value->delete(); } @@ -1036,7 +1148,6 @@ impl ast_ret_stmt { } func delete(self) { - self->base.delete(); if (self->value => i8* != nil) { self->value->delete(); } @@ -1051,10 +1162,6 @@ impl ast_continue_stmt { res->base = ast::instance(ast_kind::ast_continue_stmt, loc); return res; } - - func delete(self) { - self->base.delete(); - } } struct ast_break_stmt { base: ast } @@ -1065,10 +1172,6 @@ impl ast_break_stmt { res->base = ast::instance(ast_kind::ast_break_stmt, loc); return res; } - - func delete(self) { - self->base.delete(); - } } struct ast_code_block { @@ -1085,7 +1188,6 @@ impl ast_code_block { } func delete(self) { - self->base.delete(); self->stmts.delete(); } } diff --git a/src/parser.colgm b/src/parser.colgm index 45e376f..16fa383 100644 --- a/src/parser.colgm +++ b/src/parser.colgm @@ -736,6 +736,10 @@ impl parser { self->match_token(tok_kind::tok_arrow); res->return_type = self->type_def_gen(); } + if (self->lookahead(tok_kind::tok_semi)) { + self->match_token(tok_kind::tok_semi); + return res; + } res->body = self->block_gen(false); return res; } diff --git a/src/sema.colgm b/src/sema.colgm new file mode 100644 index 0000000..f960d69 --- /dev/null +++ b/src/sema.colgm @@ -0,0 +1,3 @@ +struct sema {} + +impl sema {} \ No newline at end of file