While list is backpatching

This commit is contained in:
Meyer Simon
2025-05-01 16:43:00 -04:00
parent 99dffaee01
commit c2132ddd00
3 changed files with 25 additions and 0 deletions

View File

@ -544,11 +544,15 @@ compound_statement statement_list {
compound_statement:
WHILE L_PAREN
{
S_Push(TrueList, S_Init(), 0);
S_Push(FalseList, S_Init(), 0);
} expression R_PAREN {
emit_label(label_gen());
emit_backpatch(S_Pop(TrueList), getLabel(current));
} sblock {
$$ = $7;
emit_label(label_gen());
emit_backpatch(S_Pop(FalseList), getLabel(current));
}
| IF L_PAREN expression R_PAREN THEN {emit_label(label_gen());}
sblock ELSE {emit_label(label_gen());}
@ -837,7 +841,20 @@ expression:
| expression LESS_THAN expression
{
emit_conditional_jump(E_LESS_THAN, 0, tn_or_const(NODE,$1), tn_or_const(NODE,$3));
Stack * t = S_Peek(TrueList);
if(t==NULL){
t = S_Init();
S_Push(TrueList, t, 1);
}
S_Push(t, current, 1);
S_Push(S_Peek(TrueList), current, 1);
emit_goto(0);
t = S_Peek(FalseList);
if(t==NULL){
t = S_Init();
S_Push(FalseList, t, 1);
}
S_Push(t, current, 1);
printdebug("less than expression");
if(getTypeEntry((TableNode*)$1) == getTypeEntry((TableNode*)$3) && getTypeEntry((TableNode*)$1)==integ) {
char* temp = temp_var_gen();