ps6: task 2
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user