Ast modified, Ast_Expr is not a union instead it uses inheritence
This commit is contained in:
@@ -70,39 +70,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_Expr){
|
||||
Ast_Begin(AST_IDENT, Ast_Atom){
|
||||
gen("%s", node->intern_val.str);
|
||||
Ast_End();
|
||||
}
|
||||
|
||||
Ast_Begin(AST_INT, Ast_Expr){
|
||||
Ast_Begin(AST_INT, Ast_Atom){
|
||||
gen("%lld", node->int_val);
|
||||
Ast_End();
|
||||
}
|
||||
|
||||
Ast_Begin(AST_STR, Ast_Expr){
|
||||
Ast_Begin(AST_STR, Ast_Atom){
|
||||
gen("LIT(\"%s\")", node->intern_val.str);
|
||||
Ast_End();
|
||||
}
|
||||
|
||||
Ast_Begin(AST_INDEX, Ast_Expr){
|
||||
gen_expr(node->index.expr);
|
||||
Ast_Begin(AST_INDEX, Ast_Index){
|
||||
gen_expr(node->expr);
|
||||
gen("[");
|
||||
gen_expr(node->index.index);
|
||||
gen_expr(node->index);
|
||||
gen("]");
|
||||
Ast_End();
|
||||
}
|
||||
|
||||
Ast_Begin(AST_UNARY, Ast_Expr){
|
||||
switch(node->unary.op){
|
||||
Ast_Begin(AST_UNARY, Ast_Unary){
|
||||
switch(node->op){
|
||||
case TK_Pointer: {
|
||||
gen("(*");
|
||||
gen_expr(node->unary.expr);
|
||||
gen_expr(node->expr);
|
||||
gen(")");
|
||||
} break;
|
||||
case TK_Dereference: {
|
||||
gen("(&");
|
||||
gen_expr(node->unary.expr);
|
||||
gen_expr(node->expr);
|
||||
gen(")");
|
||||
} break;
|
||||
invalid_default_case;
|
||||
@@ -110,38 +110,38 @@ gen_expr(Ast_Expr *ast){
|
||||
Ast_End();
|
||||
}
|
||||
|
||||
Ast_Begin(AST_CAST, Ast_Expr){
|
||||
Ast_Begin(AST_CAST, Ast_Cast){
|
||||
gen("(");
|
||||
gen("(");
|
||||
gen_simple_decl(node->cast.typespec->resolved_type, {});
|
||||
gen_simple_decl(node->typespec->resolved_type, {});
|
||||
gen(")");
|
||||
gen_expr(node->cast.expr);
|
||||
gen_expr(node->expr);
|
||||
gen(")");
|
||||
Ast_End();
|
||||
}
|
||||
|
||||
Ast_Begin(AST_COMPOUND, Ast_Expr){
|
||||
Ast_Begin(AST_COMPOUND, Ast_Compound){
|
||||
gen("(");
|
||||
gen_simple_decl(node->compound.type, {});
|
||||
gen_simple_decl(node->type, {});
|
||||
gen(")");
|
||||
|
||||
gen("{");
|
||||
For(node->compound.exprs){
|
||||
auto comp = it[0]->compound_item;
|
||||
if(comp.name){
|
||||
For(node->exprs){
|
||||
auto comp = it[0];
|
||||
if(comp->name){
|
||||
gen("[");
|
||||
gen_expr(comp.name);
|
||||
gen_expr(comp->name);
|
||||
gen("] = ");
|
||||
}
|
||||
if(comp.index){
|
||||
if(comp->index){
|
||||
gen("[");
|
||||
gen_expr(comp.index);
|
||||
gen_expr(comp->index);
|
||||
gen("] = ");
|
||||
}
|
||||
assert(comp.item);
|
||||
gen_expr(comp.item);
|
||||
assert(comp->item);
|
||||
gen_expr(comp->item);
|
||||
|
||||
if(!node->compound.exprs.is_last(it)) gen(", ");
|
||||
if(!node->exprs.is_last(it)) gen(", ");
|
||||
}
|
||||
gen("}");
|
||||
|
||||
@@ -182,10 +182,10 @@ gen_ast(Ast *ast){
|
||||
genln("");
|
||||
gen_simple_decl(lambda->ret->resolved_type, node->name);
|
||||
gen("(");
|
||||
For(lambda->params){
|
||||
assert(it[0]->kind == AST_LAMBDA_PARAM);
|
||||
gen_simple_decl(it[0]->lambda_param.typespec->resolved_type, it[0]->lambda_param.name);
|
||||
if(it != (lambda->params.end() - 1)) gen(", ");
|
||||
For(lambda->args){
|
||||
assert(it[0]->kind == AST_LAMBDA_ARG);
|
||||
gen_simple_decl(it[0]->typespec->resolved_type, it[0]->name);
|
||||
if(it != (lambda->args.end() - 1)) gen(", ");
|
||||
}
|
||||
gen(")");
|
||||
}
|
||||
@@ -224,8 +224,8 @@ test_gen(){
|
||||
sym_insert_builtins();
|
||||
eval_decl(result);
|
||||
gen(R"==(
|
||||
#define null_pointer 0
|
||||
#define null_lambda 0
|
||||
#define NULL_POINTER 0
|
||||
#define NULL_LAMBDA 0
|
||||
)==");
|
||||
gen_ast(result);
|
||||
__debugbreak();
|
||||
|
||||
Reference in New Issue
Block a user