More work on order independent bindings, A bit more cleanup, Delete some of the null code, no longer valid c code

This commit is contained in:
Krzosa Karol
2022-05-29 21:38:29 +02:00
parent b6ea62fd67
commit 2ad3131dba
5 changed files with 250 additions and 214 deletions

View File

@@ -20,15 +20,15 @@ gen_indent(){
function void
gen_simple_decl_prefix(Ast_Resolved_Type *ast){
switch(ast->kind){
case TYPE_Int: gen("int "); break;
case TYPE_Bool: gen("bool "); break;
case TYPE_Unsigned: gen("unsigned "); break;
case TYPE_String: gen("String "); break;
case TYPE_Void: gen("void "); break;
case TYPE_Pointer:{gen_simple_decl_prefix(ast->base); gen("*");} break;
case TYPE_Array: gen_simple_decl_prefix(ast->base); break;
case TYPE_Lambda:break;
case TYPE_Struct: {
case TYPE_INT: gen("int "); break;
case TYPE_BOOL: gen("bool "); break;
case TYPE_UNSIGNED: gen("unsigned "); break;
case TYPE_STRING: gen("String "); break;
case TYPE_VOID: gen("void "); break;
case TYPE_POINTER:{gen_simple_decl_prefix(ast->base); gen("*");} break;
case TYPE_ARRAY: gen_simple_decl_prefix(ast->base); break;
case TYPE_LAMBDA:break;
case TYPE_STRUCT: {
auto name = ast->sym->name;
gen("%s ", name.str);
}break;
@@ -39,22 +39,22 @@ gen_simple_decl_prefix(Ast_Resolved_Type *ast){
function void
gen_simple_decl_postfix(Ast_Resolved_Type *ast){
switch(ast->kind){
case TYPE_Int: break;
case TYPE_Bool: break;
case TYPE_Unsigned: break;
case TYPE_String: break;
case TYPE_Void: break;
case TYPE_Pointer: gen_simple_decl_postfix(ast->base); break;
case TYPE_Array: gen("[%d]", (int)ast->arr.size); gen_simple_decl_postfix(ast->arr.base); break;
case TYPE_Lambda:break;
case TYPE_Struct:break;
case TYPE_INT: break;
case TYPE_BOOL: break;
case TYPE_UNSIGNED: break;
case TYPE_STRING: break;
case TYPE_VOID: break;
case TYPE_POINTER: gen_simple_decl_postfix(ast->base); break;
case TYPE_ARRAY: gen("[%d]", (int)ast->arr.size); gen_simple_decl_postfix(ast->arr.base); break;
case TYPE_LAMBDA:break;
case TYPE_STRUCT:break;
invalid_default_case;
}
}
function void
gen_simple_decl(Ast_Resolved_Type *ast, Intern_String name){
if(ast->kind == TYPE_Lambda) {
if(ast->kind == TYPE_LAMBDA) {
gen_simple_decl_prefix(ast->func.ret);
gen("(*%s)(", name.str);
For(ast->func.args){
@@ -75,39 +75,39 @@ gen_simple_decl(Ast_Resolved_Type *ast, Intern_String name){
function void
gen_expr(Ast_Expr *ast){
switch(ast->kind){
Ast_Begin(AST_IDENT, Ast_Atom){
CASE(IDENT, Atom){
gen("%s", node->intern_val.str);
Ast_End();
BREAK();
}
Ast_Begin(AST_INT, Ast_Atom){
CASE(INT, Atom){
gen("%lld", node->int_val);
Ast_End();
BREAK();
}
Ast_Begin(AST_STR, Ast_Atom){
CASE(STR, Atom){
gen("LIT(\"%s\")", node->intern_val.str);
Ast_End();
BREAK();
}
Ast_Begin(AST_INDEX, Ast_Index){
CASE(INDEX, Index){
gen_expr(node->expr);
gen("[");
gen_expr(node->index);
gen("]");
Ast_End();
BREAK();
}
Ast_Begin(AST_BINARY, Ast_Binary){
CASE(BINARY, Binary){
gen("(");
gen_expr(node->left);
gen("%s", token_kind_string(node->op).str);
gen_expr(node->right);
gen(")");
Ast_End();
BREAK();
}
Ast_Begin(AST_UNARY, Ast_Unary){
CASE(UNARY, Unary){
switch(node->op){
case TK_Pointer: {
gen("(*");
@@ -121,20 +121,20 @@ gen_expr(Ast_Expr *ast){
} break;
invalid_default_case;
}
Ast_End();
BREAK();
}
Ast_Begin(AST_CAST, Ast_Cast){
CASE(CAST, Cast){
gen("(");
gen("(");
gen_simple_decl(resolved_type_get(node->typespec), {});
gen(")");
gen_expr(node->expr);
gen(")");
Ast_End();
BREAK();
}
Ast_Begin(AST_COMPOUND, Ast_Compound){
CASE(COMPOUND, Compound){
gen("(");
gen_simple_decl(node->type, {});
gen(")");
@@ -159,7 +159,7 @@ gen_expr(Ast_Expr *ast){
}
gen("}");
Ast_End();
BREAK();
}
invalid_default_case;
@@ -184,25 +184,25 @@ function void
gen_ast(Ast *ast){
switch(ast->kind){
Ast_Begin(AST_PACKAGE, Ast_Package){
CASE(PACKAGE, Package){
For(node->ordered) {
genln("");
gen_ast(*it);
}
Ast_End();
BREAK();
}
Ast_Begin(AST_RETURN, Ast_Return){
CASE(RETURN, Return){
gen("return");
if(node->expr){
gen(" ");
gen_expr(node->expr);
}
gen(";");
Ast_End();
BREAK();
}
Ast_Begin(AST_VAR, Ast_Var){
CASE(VAR, Var){
Sym *sym = resolved_get(node);
gen_simple_decl(sym->type, node->name);
if(node->expr){
@@ -210,10 +210,10 @@ gen_ast(Ast *ast){
gen_expr(node->expr);
}
gen(";");
Ast_End();
BREAK();
}
Ast_Begin(AST_INIT, Ast_Init){
CASE(INIT, Init){
Sym *sym = resolved_get(node);
gen_simple_decl(sym->type, node->ident->intern_val);
if(node->expr){
@@ -221,10 +221,10 @@ gen_ast(Ast *ast){
gen_expr(node->expr);
}
gen(";");
Ast_End();
BREAK();
}
Ast_Begin(AST_IF, Ast_If){
CASE(IF, If){
For(node->ifs){
if(it[0]->init) gen_ast(it[0]->init);
if(node->ifs.is_first(it)){
@@ -243,13 +243,13 @@ gen_ast(Ast *ast){
gen_block(it[0]->block);
}
}
Ast_End();
BREAK();
}
Ast_Begin(AST_CONST, Ast_Const){
CASE(CONST, Const){
Sym *sym = resolved_get(node);
if(sym->type->kind == TYPE_Lambda){
if(sym->type->kind == TYPE_LAMBDA){
if(node->value->kind == AST_LAMBDA){
Ast_Lambda *lambda = (Ast_Lambda *)node->value;
gen("static ");
@@ -283,7 +283,7 @@ gen_ast(Ast *ast){
gen("String %s = LIT(\"%s\");", node->name.str, sym->intern_val.str);
}
else if(sym->type == type_type){
if(sym->type_val->kind == TYPE_Struct){
if(sym->type_val->kind == TYPE_STRUCT){
Ast_Struct *agg = const_get_struct(sym->type_val->sym->ast);
if(node->value->kind == AST_STRUCT){
gen("struct %s{", node->name.str);
@@ -309,7 +309,7 @@ gen_ast(Ast *ast){
parsing_error(node->pos, "C_Codegen: Unhandled type of constant expression");
}
Ast_End();
BREAK();
}
invalid_default_case;