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
|
||||
{$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);}
|
||||
;
|
||||
|
||||
|
||||
@@ -143,22 +143,68 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImpl>
|
||||
|
||||
@Override
|
||||
public ArrayList<InstructionLLVM> visitIfThen(IfThenImp instr, SymTable h) {
|
||||
// TODO Auto-generated method stub
|
||||
throw new UnsupportedOperationException("Unimplemented method 'visitIfThen'");
|
||||
ArrayList<InstructionLLVM> 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<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
|
||||
public ArrayList<InstructionLLVM> visitWhile(WhileImp instr, SymTable h) {
|
||||
ArrayList<InstructionLLVM> 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));
|
||||
|
||||
@@ -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 }
|
||||
Reference in New Issue
Block a user