From 2948c372ddc5eb731831827d6b85f85e5c91677c Mon Sep 17 00:00:00 2001 From: Vu Tuan Minh Date: Fri, 11 Apr 2025 14:31:27 +0200 Subject: [PATCH] ifthenelse --- src/main/antlr/VSLParser.g | 3 +- src/main/java/TP2/asd/toLLVM_Visitor.java | 56 ++++++++++++++++++----- tests/aLaMain.vsl | 3 ++ 3 files changed, 50 insertions(+), 12 deletions(-) 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 5c1fd42..0bd5656 100644 --- a/src/main/java/TP2/asd/toLLVM_Visitor.java +++ b/src/main/java/TP2/asd/toLLVM_Visitor.java @@ -144,25 +144,59 @@ public class toLLVM_Visitor implements ProgramVisitor @Override public ArrayList visitIfThen(IfThenImp instr, SymTable h) { ArrayList 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 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 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