Merge branch 'main' of https://gitlab2.istic.univ-rennes1.fr/tuvu/tp2-vsl-pds
This commit is contained in:
@@ -134,7 +134,8 @@ instruction returns [Instruction out]:
|
|||||||
| ELSE ins2=instruction FIN
|
| ELSE ins2=instruction FIN
|
||||||
{$out= new IfThenElseImp($ex1.out, $ins1.out,$ins2.out); }
|
{$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);}
|
{$out = new WhileImp($exp1.out,$ins3.out);}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|||||||
@@ -143,22 +143,68 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImpl>
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ArrayList<InstructionLLVM> visitIfThen(IfThenImp instr, SymTable h) {
|
public ArrayList<InstructionLLVM> visitIfThen(IfThenImp instr, SymTable h) {
|
||||||
// TODO Auto-generated method stub
|
ArrayList<InstructionLLVM> l = new ArrayList<>();
|
||||||
throw new UnsupportedOperationException("Unimplemented method 'visitIfThen'");
|
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
|
@Override
|
||||||
public ArrayList<InstructionLLVM> visitIfThenElse(IfThenElseImp instr, SymTable h) {
|
public ArrayList<InstructionLLVM> visitIfThenElse(IfThenElseImp instr, SymTable h) {
|
||||||
// TODO Auto-generated method stub
|
ArrayList<InstructionLLVM> l = new ArrayList<>();
|
||||||
throw new UnsupportedOperationException("Unimplemented method 'visitIfThenElse'");
|
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
|
@Override
|
||||||
public ArrayList<InstructionLLVM> visitWhile(WhileImp instr, SymTable h) {
|
public ArrayList<InstructionLLVM> visitWhile(WhileImp instr, SymTable h) {
|
||||||
ArrayList<InstructionLLVM> l = new ArrayList<>();
|
ArrayList<InstructionLLVM> l = new ArrayList<>();
|
||||||
|
|
||||||
String labelWhile = "while"+h.getNewIdLabel();
|
String labelWhile = "while"+h.getNewIdLabel()+":";
|
||||||
String labelDo = "do"+h.getNewIdLabel();
|
String labelDo = "do"+h.getNewIdLabel()+":";
|
||||||
String labelDone = "done"+h.getNewIdLabel();
|
String labelDone = "done"+h.getNewIdLabel();
|
||||||
|
|
||||||
l.add(new LabelLLVMImp(labelWhile));
|
l.add(new LabelLLVMImp(labelWhile));
|
||||||
|
|||||||
@@ -9,5 +9,8 @@ FUNC INT main() {
|
|||||||
c := c + 1
|
c := c + 1
|
||||||
}
|
}
|
||||||
DONE
|
DONE
|
||||||
|
IF c -1
|
||||||
|
THEN READ a ELSE READ b
|
||||||
|
FI
|
||||||
b:=c+1
|
b:=c+1
|
||||||
RETURN 4 + 6 * 5 + 2 }
|
RETURN 4 + 6 * 5 + 2 }
|
||||||
Reference in New Issue
Block a user