diff --git a/ps6/src/generator.c b/ps6/src/generator.c index 494b992..d594887 100644 --- a/ps6/src/generator.c +++ b/ps6/src/generator.c @@ -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