For loop iterate through arrays and slices

This commit is contained in:
Krzosa Karol
2022-06-19 22:31:59 +02:00
parent 367562f0a8
commit aa5741203f
6 changed files with 67 additions and 14 deletions

View File

@@ -500,14 +500,41 @@ gen_ast(Ast *ast){
}
CASE(FOR, For){
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);
// Array iter
if(node->is_array_traversal){
gen("for(S64 _i%d = 0; _i%d < ", node->pos->line, node->pos->line);
gen_expr(node->cond);
gen(".len; _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);
genln("");
gen_ast(it);
}
global_indent--;
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();
}