Core: Add Ast_Label

This commit is contained in:
Krzosa Karol
2023-04-22 12:38:48 +02:00
parent d244608571
commit eff6b10cf4
10 changed files with 140 additions and 98 deletions

View File

@@ -621,95 +621,95 @@ gen_ast(Ast *ast) {
BREAK();
}
CASE(CONTINUE, Pass) {
unused(node);
case AST_LABEL: {
auto n = (Ast_Label *)ast;
if (n->enable_goto == false) gen("/* %Q */", n->name);
if (n->enable_goto == true) gen("%Q:", n->name);
gen_stmt_scope(n->scope);
} break;
case AST_CONTINUE: {
gen("continue;");
BREAK();
}
CASE(BREAK, Break) {
unused(node);
} break;
case AST_BREAK: {
gen("break;");
BREAK();
}
} break;
CASE(COMPILER_BREAKPOINT_STMT, Break) {
unused(node);
case AST_COMPILER_BREAKPOINT_STMT: {
__debugbreak();
BREAK();
}
} break;
CASE(PASS, Pass) {
unused(node);
gen("//pass");
BREAK();
}
case AST_PASS: {
gen("// pass");
} break;
CASE(BINARY, Binary) {
gen_expr(node);
gen(";");
BREAK();
}
CASE(BINARY, Binary) {
gen_expr(node);
gen(";");
BREAK();
}
CASE(FOR, For) {
// Array iter
if (node->is_array_traversal) {
gen("for(int64_t _i%d = 0; _i%d < ", node->pos->line, node->pos->line);
if (is_array(node->cond->resolved_type)) {
gen("BufferSize(");
gen_expr(node->cond);
gen(")");
}
else {
assert(is_slice(node->cond->resolved_type));
gen_expr(node->cond);
gen(".len");
}
CASE(FOR, For) {
// Array iter
if (node->is_array_traversal) {
gen("for(int64_t _i%d = 0; _i%d < ", node->pos->line, node->pos->line);
if (is_array(node->cond->resolved_type)) {
gen("BufferSize(");
gen_expr(node->cond);
gen(")");
}
else {
assert(is_slice(node->cond->resolved_type));
gen_expr(node->cond);
gen(".len");
}
gen("; _i%d+=1)", node->pos->line);
gen("{");
global_indent++;
genln("");
gen_simple_decl(node->array_traversal_var->type, node->array_traversal_var->name);
gen(" = ");
gen_expr(node->cond);
if (node->is_also_slice_traversal) gen(".data");
gen(" + _i%d;", node->pos->line);
For(node->scope->stmts) {
gen_line(it);
gen("; _i%d+=1)", node->pos->line);
gen("{");
global_indent++;
genln("");
gen_ast(it);
gen_simple_decl(node->array_traversal_var->type, node->array_traversal_var->name);
gen(" = ");
gen_expr(node->cond);
if (node->is_also_slice_traversal) gen(".data");
gen(" + _i%d;", node->pos->line);
For(node->scope->stmts) {
gen_line(it);
genln("");
gen_ast(it);
}
global_indent--;
gen_last_line();
genln("}");
}
global_indent--;
gen_last_line();
genln("}");
// Normal for loop
else {
gen("for(");
if (node->init) gen_expr(node->init);
gen(";");
if (node->cond) gen_expr(node->cond);
gen(";");
if (node->iter) gen_expr(node->iter);
gen(")");
gen_stmt_scope(node->scope);
}
BREAK();
}
// Normal for loop
else {
gen("for(");
if (node->init) gen_expr(node->init);
gen(";");
if (node->cond) gen_expr(node->cond);
gen(";");
if (node->iter) gen_expr(node->iter);
gen(")");
gen_stmt_scope(node->scope);
CASE(LAMBDA, Decl) {
gen_line(node);
genln("");
if (is_flag_set(node->expr->flags, AST_FOREIGN)) {
gen("/*foreign*/");
}
gen_lambda(node->unique_name, node->lambda);
BREAK();
}
BREAK();
}
CASE(LAMBDA, Decl) {
gen_line(node);
genln("");
if (is_flag_set(node->expr->flags, AST_FOREIGN)) {
gen("/*foreign*/");
}
gen_lambda(node->unique_name, node->lambda);
BREAK();
}
case AST_UNION:
CASE(STRUCT, Decl) {
gen("%s ", node->kind == AST_STRUCT ? "struct" : "union");