ifthenelse

This commit is contained in:
Vu Tuan Minh
2025-04-11 14:31:27 +02:00
parent db68bc1a4e
commit 2948c372dd
3 changed files with 50 additions and 12 deletions

View File

@@ -134,7 +134,8 @@ instruction returns [Instruction out]:
| ELSE ins2=instruction FIN
{$out= new IfThenElseImp($ex1.out, $ins1.out,$ins2.out); }
)
| WHILE exp1=expression DO ins3=instruction DONE
| //WHILE
WHILE exp1=expression DO ins3=instruction DONE
{$out = new WhileImp($exp1.out,$ins3.out);}
;

View File

@@ -144,25 +144,59 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImpl>
@Override
public ArrayList<InstructionLLVM> visitIfThen(IfThenImp instr, SymTable h) {
ArrayList<InstructionLLVM> l = new ArrayList<>();
String labelIf= "if"+h.getNewIdLabel();
String labelThen= "then"+h.getNewIdLabel();
String labelEnd= "end"+h.getNewIdLabel();
String labelIf= "if"+h.getNewIdLabel()+":";
String labelThen= "then"+h.getNewIdLabel()+":";
String labelFin= "fin"+h.getNewIdLabel();
l.add(new LabelLLVMImp(labelIf));
//TODO
//Je t'attends Tibo
l.add(new LabelLLVMImp(labelThen));
//TODO
InstrAndVal temp = instr.e().accept(this,h);
l.addAll(temp.instrs);
ValLLVM val = temp.val;
ExpressionLLVM exTemp = new IcmpLLVMImp(val,new ValLLVMImpl(new IntLLVMImpl(), 0));
Result temp2 = h.addNewTempVar();
h = temp2.symTable;
VarLLVMImpl varCond = new VarLLVMImpl(exTemp.getType(), temp2.var);
l.add(new AssignLVMImpl(varCond,exTemp));
l.add(new BrCondLLVMImp(varCond,labelThen,labelFin));
l.add(new LabelLLVMImp(labelThen));
l.addAll(instr.i1().accept(this,h));
l.add(new LabelLLVMImp(labelFin));
l.add(new LabelLLVMImp(labelEnd));
return l;
}
@Override
public ArrayList<InstructionLLVM> visitIfThenElse(IfThenElseImp instr, SymTable h) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'visitIfThenElse'");
ArrayList<InstructionLLVM> l = new ArrayList<>();
String labelIf= "if"+h.getNewIdLabel()+":";
String labelThen= "then"+h.getNewIdLabel()+":";
String labelElse= "else"+h.getNewIdLabel()+":";
String labelFin= "fin"+h.getNewIdLabel();
l.add(new LabelLLVMImp(labelIf));
InstrAndVal temp = instr.e().accept(this,h);
l.addAll(temp.instrs);
ValLLVM val = temp.val;
ExpressionLLVM exTemp = new IcmpLLVMImp(val,new ValLLVMImpl(new IntLLVMImpl(), 0));
Result temp2 = h.addNewTempVar();
h = temp2.symTable;
VarLLVMImpl varCond = new VarLLVMImpl(exTemp.getType(), temp2.var);
l.add(new AssignLVMImpl(varCond,exTemp));
l.add(new BrCondLLVMImp(varCond,labelThen,labelElse));
l.add(new LabelLLVMImp(labelThen));
l.addAll(instr.i1().accept(this,h));
l.add(new BrLLVMImp(labelFin));
l.add(new LabelLLVMImp(labelElse));
l.addAll(instr.i2().accept(this,h));
l.add(new BrLLVMImp(labelFin));
l.add(new LabelLLVMImp(labelFin));
return l;
}
@Override

View File

@@ -9,5 +9,8 @@ FUNC INT main() {
c := c + 1
}
DONE
IF c -1
THEN READ a ELSE READ b
FI
b:=c+1
RETURN 4 + 6 * 5 + 2 }