package TP2.asd; import java.util.ArrayList; import TP2.asd.Interface.*; import TP2.asd.Program.*; import TP2.asd.SymTable.*; import TP2.llvm.Interface.*; import TP2.llvm.ProgramLLVM.*; public class toLLVM_Visitor implements ProgramVisitor, FunctionVisitor, InstrVisitor>, ExprVisitor, TypeVisitor { /* pour les Expression, toLLVM ne renvoit pas la même chose si l'expression est une simplement un val (var ou const) ou un binop */ public static class InstrAndVal{ public ArrayList instr = null; public ValLLVM val = null; public InstrAndVal(ArrayList instr, ValLLVM val){ this.instr = instr; this.val = val; } } //PROGRAM @Override public ProgramLLVMImpl visitProgram(ProgramImp prog, SymTable h) { ArrayList fonctionLLVM = new ArrayList<>(); for(int i = 0; i(),fonctionLLVM); } //FUNCTION @Override public DefineLLVM visitFunction(FunctionImp fun, SymTable h) { ArrayList instrLLVM = new ArrayList<>(); for(int i = 0; i visitReturn(Return_instrImp instr, SymTable h) { InstrAndVal res = instr.e().accept(this,h); ValLLVM var = res.val; InstructionLLVM r = new ReturnLLVMImp(var.getType(),var); ArrayList result = new ArrayList<>(); result.addAll(res.instr); result.add(r); return result; } @Override public ArrayList visitAssign(AssignImp instr, SymTable h) { InstrAndVal res = instr.e().accept(this,h); ValLLVM var = res.val; ArrayList result = new ArrayList<>(); result.addAll(res.instr); //InstructionLLVM r = new AssignLVMImp(new VarLLVMImpl(var.getType(),instr.t()),var); InstructionLLVM r = new StoreLLVMImp(var.getType(),var,var.getType(),new VarLLVMImpl(var.getType(),instr.t()/*"h.getVar(instr.t())*/)); result.add(r); return result; } @Override public ArrayList visitDeclaration(DeclarationImp instr, SymTable h) { ArrayList list = new ArrayList<>(); for(int i = 0; i visitPrint(PrintImp instr, SymTable h) { ArrayList l = new ArrayList<>(); l.add(new PrintLLVMImp(new ArrayList())); //TODO return l; } @Override public ArrayList visitRead(ReadImp instr, SymTable h) { // TODO Auto-generated method stub throw new UnsupportedOperationException("Unimplemented method 'visitRead'"); } //EXPRESSION @Override public InstrAndVal visitConst(ConstImp e, SymTable h) { ValLLVM val = new ValLLVMImpl(new IntLLVMImpl(),e.c()); return new InstrAndVal(new ArrayList<>(), val); } @Override public InstrAndVal visitVar(VarImp e, SymTable h) { ValLLVM val = new VarLLVMImpl(new IntLLVMImpl(), e.name()); return new InstrAndVal(new ArrayList<>(), val); } @Override public InstrAndVal visitBinOp(BinopExpressionImp e, SymTable h) { ArrayList list = new ArrayList<>(); InstrAndVal res1 = e.e1().accept(this, h); InstrAndVal res2 = e.e2().accept(this, h); ValLLVM val1 = res1.val; ValLLVM val2 = res2.val; list.addAll(res1.instr); list.addAll(res2.instr); TypeLLVM type = val1.getType(); if(val1.getType().getClass() != val1.getType().getClass()){ throw new UnsupportedOperationException("Type error in VSL file"); } String temp = h.addNewTempVar(); VarLLVMImpl var = new VarLLVMImpl(type,temp); list.add(new AssignLVMImp(var, new BinOpLLVMImp(type,e.op(),val1,val2))); return new InstrAndVal(list, var); } @Override public TypeLLVM visitInt(Type_intImp t, SymTable h) { return new IntLLVMImpl(); } @Override public TypeLLVM visitVoid(Type_voidImp t, SymTable h) { return new VoidLLVMImpl(); } }