diff --git a/src/main/antlr/VSLParser.g b/src/main/antlr/VSLParser.g index ea2700a..46b5068 100644 --- a/src/main/antlr/VSLParser.g +++ b/src/main/antlr/VSLParser.g @@ -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);} ; diff --git a/src/main/java/TP2/asd/toLLVM_Visitor.java b/src/main/java/TP2/asd/toLLVM_Visitor.java index 5932221..fafb063 100644 --- a/src/main/java/TP2/asd/toLLVM_Visitor.java +++ b/src/main/java/TP2/asd/toLLVM_Visitor.java @@ -143,22 +143,68 @@ public class toLLVM_Visitor implements ProgramVisitor @Override public ArrayList visitIfThen(IfThenImp instr, SymTable h) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'visitIfThen'"); + ArrayList l = new ArrayList<>(); + String labelIf= "if"+h.getNewIdLabel()+":"; + String labelThen= "then"+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,labelFin)); + + l.add(new LabelLLVMImp(labelThen)); + l.addAll(instr.i1().accept(this,h)); + + l.add(new LabelLLVMImp(labelFin)); + + return l; } @Override public ArrayList visitIfThenElse(IfThenElseImp instr, SymTable h) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'visitIfThenElse'"); + ArrayList 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 public ArrayList visitWhile(WhileImp instr, SymTable h) { ArrayList l = new ArrayList<>(); - String labelWhile = "while"+h.getNewIdLabel(); - String labelDo = "do"+h.getNewIdLabel(); + String labelWhile = "while"+h.getNewIdLabel()+":"; + String labelDo = "do"+h.getNewIdLabel()+":"; String labelDone = "done"+h.getNewIdLabel(); l.add(new LabelLLVMImp(labelWhile)); diff --git a/tests/aLaMain.vsl b/tests/aLaMain.vsl index 443d346..6921373 100644 --- a/tests/aLaMain.vsl +++ b/tests/aLaMain.vsl @@ -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 } \ No newline at end of file