ps6: task 2

This commit is contained in:
2026-04-28 22:27:14 +02:00
parent 5bc4780a7d
commit 0f8e8b625f
+30
View File
@@ -483,11 +483,41 @@ static void generate_if_statement(node_t* statement)
LABEL("%s", endif_label);
}
int while_counter = 0;
int root_while = 0, nesting_level = 0;
static void generate_while_statement(node_t* statement)
{
// TODO (Task 2):
// Implement while loops, similarily to the way if statements were generated.
// Remember to make label names unique, and to handle nested while loops.
char while_label[8];
snprintf(while_label, 8, "WHILE%d", while_counter);
char endwhile_label[8];
snprintf(endwhile_label, 8, "ENDWH%d", while_counter);
if (nesting_level == 0)
root_while = while_counter;
while_counter++;
nesting_level++;
LABEL("%s", while_label);
node_t *condition = statement->children[0];
generate_expression(condition);
CMPQ("$0", RAX);
JE(endwhile_label);
node_t *body = statement->children[1];
generate_statement(body);
JMP(while_label);
LABEL("%s", endwhile_label);
nesting_level--;
}
// Leaves the currently innermost while loop using its end-label