diff --git a/src/main/java/TP2/asd/Interface.java b/src/main/java/TP2/asd/Interface.java index b13ef5c..7fc9730 100644 --- a/src/main/java/TP2/asd/Interface.java +++ b/src/main/java/TP2/asd/Interface.java @@ -66,8 +66,8 @@ public interface Interface{ public interface ExprVisitor { public S visitConst(ConstImp e,H h); - public S visitBinOp(BinopExpressionImp e, H h); public S visitVar(VarImp e,H h); + public S visitBinOp(BinopExpressionImp e, H h); public S visitCall(CallImp instr, H h); } diff --git a/src/main/java/TP2/asd/PrettyprinterVisitor.java b/src/main/java/TP2/asd/PrettyprinterVisitor.java index 16a1ef7..d0f34a1 100644 --- a/src/main/java/TP2/asd/PrettyprinterVisitor.java +++ b/src/main/java/TP2/asd/PrettyprinterVisitor.java @@ -195,11 +195,6 @@ public class PrettyprinterVisitor implements ProgramVisitor, //EXPRESSION ----------------------------------- - @Override - public String visitConst(ConstImp e, String indent) { - return e.c()+""; - } - @Override public String visitBinOp(BinopExpressionImp e, String indent) { String opStr = "?"; @@ -215,12 +210,17 @@ public class PrettyprinterVisitor implements ProgramVisitor, } + @Override + public String visitConst(ConstImp e, String indent) { + return e.c()+""; + } + + @Override public String visitVar(VarImp e, String h) { return e.name(); } - @Override public String visitCall(CallImp instr,String indent){ String str = indent + instr.fName() + "("; diff --git a/src/main/java/TP2/asd/toLLVM_Visitor.java b/src/main/java/TP2/asd/toLLVM_Visitor.java index 16a1887..5483457 100644 --- a/src/main/java/TP2/asd/toLLVM_Visitor.java +++ b/src/main/java/TP2/asd/toLLVM_Visitor.java @@ -59,7 +59,7 @@ public class toLLVM_Visitor implements ProgramVisitor, } - //FUNCTION + //FUNCTION ----------------------------------- @Override public DefineLLVMImp visitFunction(FunctionImp fun, SymTable h) { @@ -94,6 +94,7 @@ public class toLLVM_Visitor implements ProgramVisitor, return define; } + @Override public DefineLLVMImp visitPrototype(PrototypeImp fun, SymTable h) { ArrayList params = new ArrayList<>(); @@ -103,7 +104,7 @@ public class toLLVM_Visitor implements ProgramVisitor, return new DefineLLVMImp(fun.nom(), fun.type().accept(this, h), params,null); } - //DECLARATION + //DECLARATION ----------------------------------- @Override public InstrAndSymTable visitDeclaration(DeclarationImp instr, SymTable h) { @@ -145,35 +146,7 @@ public class toLLVM_Visitor implements ProgramVisitor, return new InstrAndSymTable(list,h); } - //INSTRUCTION - - @Override - public ArrayList visitBloc(BlocImp instr, SymTable h) { - h= h.newBlock(); - ArrayList instrLLVM = new ArrayList<>(); - for(int i = 0; i visitBlocDec(BlocDecImp instr, SymTable h) { - - ArrayList instrLLVM = new ArrayList<>(); - for(int i = 0; i visitReturn(Return_instrImp instr, SymTable h) { @@ -193,6 +166,36 @@ public class toLLVM_Visitor implements ProgramVisitor, } + @Override + public ArrayList visitBloc(BlocImp instr, SymTable h) { + h= h.newBlock(); + ArrayList instrLLVM = new ArrayList<>(); + for(int i = 0; i visitBlocDec(BlocDecImp instr, SymTable h) { + + ArrayList instrLLVM = new ArrayList<>(); + for(int i = 0; i visitAssign(AssignImp instr, SymTable h) { InstrAndVal res = instr.e().accept(this,h); @@ -258,6 +261,7 @@ public class toLLVM_Visitor implements ProgramVisitor, return l; } + @Override public ArrayList visitRead(ReadImp instr, SymTable h) { ArrayList l = new ArrayList<>(); @@ -291,30 +295,6 @@ public class toLLVM_Visitor implements ProgramVisitor, return l; } - @Override - public ArrayList visitVoidFunction(VoidFunctionImp instr, SymTable h) { - ArrayList l = new ArrayList<>(); - ArrayList paramsLLVM = new ArrayList<>(); - - for(Expression param: instr.expr()){ - InstrAndVal result = param.accept(this, h); - l.addAll(result.instrs); - paramsLLVM.add(result.val); - } - ValueFunMap fun= h.getFunction(instr.nom()); - if(fun == null){ - System.err.println("Function n'est pas trouvé"); - return l; - } - - if (!(fun.define.type() instanceof VoidLLVMImp)){ - System.err.println("Fonction n'est pas un void"); - return l; - } - - l.add(new CallVoidLLVMImp(fun.define,paramsLLVM,"")); - return l; - } @Override public ArrayList visitIfThen(IfThenImp instr, SymTable h) { @@ -345,6 +325,7 @@ public class toLLVM_Visitor implements ProgramVisitor, return l; } + @Override public ArrayList visitIfThenElse(IfThenElseImp instr, SymTable h) { ArrayList l = new ArrayList<>(); @@ -379,6 +360,7 @@ public class toLLVM_Visitor implements ProgramVisitor, return l; } + @Override public ArrayList visitWhile(WhileImp instr, SymTable h) { ArrayList l = new ArrayList<>(); @@ -412,8 +394,34 @@ public class toLLVM_Visitor implements ProgramVisitor, return l; } + + @Override + public ArrayList visitVoidFunction(VoidFunctionImp instr, SymTable h) { + ArrayList l = new ArrayList<>(); + ArrayList paramsLLVM = new ArrayList<>(); - //EXPRESSION + for(Expression param: instr.expr()){ + InstrAndVal result = param.accept(this, h); + l.addAll(result.instrs); + paramsLLVM.add(result.val); + } + ValueFunMap fun= h.getFunction(instr.nom()); + if(fun == null){ + System.err.println("Function n'est pas trouvé"); + return l; + } + + if (!(fun.define.type() instanceof VoidLLVMImp)){ + System.err.println("Fonction n'est pas un void"); + return l; + } + + l.add(new CallVoidLLVMImp(fun.define,paramsLLVM,"")); + return l; + } + + + //EXPRESSION ----------------------------------- @Override public InstrAndVal visitConst(ConstImp e, SymTable h) { @@ -465,12 +473,8 @@ public class toLLVM_Visitor implements ProgramVisitor, l.addAll( result.instrs); paramsLLVM.add(result.val); } - ValueFunMap fLLVM = h.getFunction(instr.fName()); //on récupère la fonction LLVM dans la table des Symboles - //if(fLLVM == null){ - // System.err.println("[VSL compile error] : la fonction n'existe pas, veuillez vous assurer de l'avoir déclarée avant l'appel"); - // return new InstrAndVal(l, null); - //} - + ValueFunMap fLLVM = h.getFunction(instr.fName()); + //Pour c=func(x,y) if (fLLVM.define.type() instanceof VoidLLVMImp) { l.add(new CallVoidLLVMImp(fLLVM.define, paramsLLVM, "")); @@ -485,6 +489,8 @@ public class toLLVM_Visitor implements ProgramVisitor, } } + //TYPE ----------------------------------- + @Override public TypeLLVM visitInt(Type_intImp t, SymTable h) { return new IntLLVMImp();