diff --git a/src/main/java/TP2/asd/toLLVM_Visitor.java b/src/main/java/TP2/asd/toLLVM_Visitor.java index fcd8d64..4e5566b 100644 --- a/src/main/java/TP2/asd/toLLVM_Visitor.java +++ b/src/main/java/TP2/asd/toLLVM_Visitor.java @@ -57,7 +57,7 @@ public class toLLVM_Visitor implements ProgramVisitor public DefineLLVM visitFunction(FunctionImp fun, SymTable h) { ArrayList instrLLVM = new ArrayList<>(); instrLLVM.addAll(fun.instruction().accept(this, h)); - return new DefineLLVMImpl(fun.nom(), fun.type().accept(this, h), instrLLVM); + return new DefineLLVMImpl(fun.nom(), fun.type().accept(this, h), new ArrayList<>(), instrLLVM); } //DECLARATION @@ -130,7 +130,8 @@ public class toLLVM_Visitor implements ProgramVisitor @Override public ArrayList visitPrint(PrintImp instr, SymTable h) { ArrayList l = new ArrayList<>(); - l.add(new PrintLLVMImpl(new ArrayList())); //TODO + ArrayList params = new ArrayList<>(); + l.add(new PrintLLVMImpl(params)); //TODO return l; } @@ -141,7 +142,9 @@ public class toLLVM_Visitor implements ProgramVisitor String nomVar = h.getVar(instr.t().get(i).name()); Type typeVar = h.getType(instr.t().get(i).name()); VarLLVMImpl newVar = new VarLLVMImpl(typeVar.accept(this,h), nomVar); - l.add(new ReadLLVMImpl(newVar)); + ArrayList params = new ArrayList<>(); + params.add(newVar); + l.add(new ReadLLVMImpl(params)); } return l; } diff --git a/src/main/java/TP2/llvm/Interface.java b/src/main/java/TP2/llvm/Interface.java index f2ba575..30c6bf6 100644 --- a/src/main/java/TP2/llvm/Interface.java +++ b/src/main/java/TP2/llvm/Interface.java @@ -1,5 +1,4 @@ package TP2.llvm; -import TP2.asd.Program.IfThenElseImp; import TP2.llvm.ProgramLLVM.*; public interface Interface { @@ -35,6 +34,7 @@ public interface Interface { public S visitLabelLLVM(LabelLLVMImp instr, H h); public S visitBrLLVM(BrLLVMImp instr, H h); public S visitBrCondLLVM(BrCondLLVMImp instr, H h); + public S visitCallLLVM(CallLLVMImpl instr, H h); } //////////ExpressionLLVM (expression) @@ -70,6 +70,7 @@ public interface Interface { public S visitIntLLVM(IntLLVMImpl e,H h); public S visitVoidLLVM(VoidLLVMImpl e, H h); public S visitBooleanLLVM(BooleanLLVMImp e, H h); + public S visitStringLLVM(StringLLVMImp e, H h); } } diff --git a/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java b/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java index aaa0df2..9b8ad86 100644 --- a/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java +++ b/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java @@ -1,5 +1,7 @@ package TP2.llvm; +import java.util.ArrayList; + import TP2.asd.Program.IfThenElseImp; import TP2.llvm.Interface.*; import TP2.llvm.ProgramLLVM.*; @@ -29,6 +31,7 @@ TypeLLVMVisitor //} //PROTO et FUNC + for(DefineLLVM fonction : prog.fonctions()){ str.append(fonction.accept(this,indent)); str.append("\n"); @@ -39,7 +42,7 @@ TypeLLVMVisitor @Override public String visitDefineLLVM(DefineLLVMImpl define, String indent) { StringBuilder str = new StringBuilder("define "); - str.append(define.type().accept(this,indent)).append(" @").append(define.nom()).append("("); + str.append(define.type().accept(this,indent)).append(" @").append(define.name()).append("("); //TODO param @@ -107,21 +110,34 @@ TypeLLVMVisitor return "load" + " " + e.getType().accept(this, h) + ", "+ e.getType().accept(this, h) + "* " + e.val().accept(this, h); } - @Override - public String visitPrintLLVM(PrintLLVMImpl instr, String h) { - return INDENT+"call " + "...TODO..." +" printf " + "...TODO..."; + public String visitCallLLVM(CallLLVMImpl instr, String h) { + String str = INDENT+ "call " + instr.str() + instr.f().type().accept(this, h) + " @"+instr.f().name() + "("; + for(int i = 0; i(), new ArrayList<>()); + CallLLVMImpl callPrint = new CallLLVMImpl(printLLVM, new ArrayList<>(),"(i8*,...) "); + return callPrint.accept(this, h); + } + + @Override + public String visitReadLLVM(ReadLLVMImpl instr, String h) { //TODO + DefineLLVMImpl readLLVM = new DefineLLVMImpl("scanf", new IntLLVMImpl(), new ArrayList<>(), new ArrayList<>()); + CallLLVMImpl callRead = new CallLLVMImpl(readLLVM, instr.l(),"(i8*,...) "); + return callRead.accept(this, h); } //label @Override public String visitLabelLLVM(LabelLLVMImp instr, String h) { - return instr.nom()+":"; + return instr.name()+":"; } @Override @@ -160,4 +176,10 @@ TypeLLVMVisitor public String visitBooleanLLVM(BooleanLLVMImp e, String h) { return "i1"; } + + @Override + public String visitStringLLVM(StringLLVMImp e, String h) { + return "i8*"; + } + } diff --git a/src/main/java/TP2/llvm/ProgramLLVM.java b/src/main/java/TP2/llvm/ProgramLLVM.java index 9068454..8f2f585 100644 --- a/src/main/java/TP2/llvm/ProgramLLVM.java +++ b/src/main/java/TP2/llvm/ProgramLLVM.java @@ -22,7 +22,7 @@ public class ProgramLLVM { //Define - public static record DefineLLVMImpl(String nom, TypeLLVM type, ArrayList instrs) implements DefineLLVM{ + public static record DefineLLVMImpl(String name, TypeLLVM type, ArrayList params, ArrayList instrs) implements DefineLLVM{ public S accept(DefineLLVMVisitor v, H h) { return v.visitDefineLLVM(this, h); } @@ -31,7 +31,7 @@ public class ProgramLLVM { //Instructon : //Label - public static record LabelLLVMImp(String nom) implements InstructionLLVM{ + public static record LabelLLVMImp(String name) implements InstructionLLVM{ @Override public S accept(InstructionLLVMVisitor v, H h) { return v.visitLabelLLVM(this, h); @@ -74,14 +74,21 @@ public class ProgramLLVM { } } - public static record PrintLLVMImpl(ArrayList l) implements InstructionLLVM{ + public static record CallLLVMImpl(DefineLLVMImpl f, ArrayList params, String str) implements InstructionLLVM{ + @Override + public S accept(InstructionLLVMVisitor v, H h) { + return v.visitCallLLVM(this, h); + } + } + + public static record PrintLLVMImpl(ArrayList l) implements InstructionLLVM{ //TODO c'est un Call qui appel la fonction print @Override public S accept(InstructionLLVMVisitor v, H h) { return v.visitPrintLLVM(this, h); } } - public static record ReadLLVMImpl(VarLLVMImpl var) implements InstructionLLVM{ + public static record ReadLLVMImpl(ArrayList l) implements InstructionLLVM{ //TODO c'est un Call qui appel la fonction read @Override public S accept(InstructionLLVMVisitor v, H h) { @@ -203,4 +210,11 @@ public class ProgramLLVM { return v.visitBooleanLLVM(this, h); } } + + public static record StringLLVMImp() implements TypeLLVM{ + @Override + public S accept(TypeLLVMVisitor v, H h) { + return v.visitStringLLVM(this, h); + } + } }