From 35c2c23985054b1ba1eee60c7de592f7848f1000 Mon Sep 17 00:00:00 2001 From: trochas Date: Fri, 11 Apr 2025 14:52:38 +0200 Subject: [PATCH 1/3] Load Var --- src/main/java/TP2/asd/SymTable.java | 4 ++-- src/main/java/TP2/asd/toLLVM_Visitor.java | 8 ++++++-- src/main/java/TP2/llvm/Interface.java | 2 +- src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java | 4 ++-- src/main/java/TP2/llvm/ProgramLLVM.java | 4 ++-- 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/main/java/TP2/asd/SymTable.java b/src/main/java/TP2/asd/SymTable.java index 4475192..5830d6d 100644 --- a/src/main/java/TP2/asd/SymTable.java +++ b/src/main/java/TP2/asd/SymTable.java @@ -109,10 +109,10 @@ public class SymTable { return this.stackmap(); } - public ValueTable getvar_Type(String s){ + public Type getvar_Type(String s){ for(int i= stackMap.size()-1; i>=0; i--){ if(stackMap.get(i).containsKey(s)){ - return stackMap.get(i).get(s); + return stackMap.get(i).get(s).type; } } return null; diff --git a/src/main/java/TP2/asd/toLLVM_Visitor.java b/src/main/java/TP2/asd/toLLVM_Visitor.java index 5094d83..5932221 100644 --- a/src/main/java/TP2/asd/toLLVM_Visitor.java +++ b/src/main/java/TP2/asd/toLLVM_Visitor.java @@ -192,8 +192,12 @@ public class toLLVM_Visitor implements ProgramVisitor @Override public InstrAndVal visitVar(VarImp e, SymTable h) { - ValLLVM val = new VarLLVMImpl(new IntLLVMImpl(), e.name()); - return new InstrAndVal(new ArrayList<>(), val); + ArrayList l =new ArrayList<>(); + ValLLVM val = new VarLLVMImpl(h.getvar_Type(e.name()).accept(this,h),h.getVar(e.name())); + + VarLLVMImpl varTemp = new VarLLVMImpl(h.getvar_Type(e.name()).accept(this,h),h.addNewTempVar().var); + l.add(new AssignLVMImpl(varTemp,((ExpressionLLVM)(new LoadLLVMImpl(val))))); + return new InstrAndVal(l, varTemp); } @Override diff --git a/src/main/java/TP2/llvm/Interface.java b/src/main/java/TP2/llvm/Interface.java index 672c00d..106b41b 100644 --- a/src/main/java/TP2/llvm/Interface.java +++ b/src/main/java/TP2/llvm/Interface.java @@ -52,7 +52,7 @@ public interface Interface { public interface ExpressionLLVMVisitor { public S visitBinOpLLVM(BinOpLLVMImpl e, H h); public S visitAllocaLLVM(allocaLLVMImpl e,H h); - public S visitLoadLLVM(loadLLVMImpl e,H h); + public S visitLoadLLVM(LoadLLVMImpl e,H h); public S visitValLLVM(ValLLVMImpl e,H h); public S visitVarLLVM(VarLLVMImpl e,H h); public S visitIcmpLLVM(IcmpLLVMImp e, H h); diff --git a/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java b/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java index 158bb79..8c829cc 100644 --- a/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java +++ b/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java @@ -103,8 +103,8 @@ TypeLLVMVisitor @Override - public String visitLoadLLVM(loadLLVMImpl e, String h) { - return "load" + " i" + e.nbBits() + ", i"+ e.nbBits2() + "* %" + e.val().accept(this, h); + public String visitLoadLLVM(LoadLLVMImpl e, String h) { + return "load" + " " + e.getType().accept(this, h) + ", "+ e.getType().accept(this, h) + "* " + e.val().accept(this, h); } diff --git a/src/main/java/TP2/llvm/ProgramLLVM.java b/src/main/java/TP2/llvm/ProgramLLVM.java index 488c31a..c2522db 100644 --- a/src/main/java/TP2/llvm/ProgramLLVM.java +++ b/src/main/java/TP2/llvm/ProgramLLVM.java @@ -153,7 +153,7 @@ public class ProgramLLVM { } - public static record loadLLVMImpl(TypeLLVM type, int nbBits,int nbBits2, ValLLVM val) implements ExpressionLLVM{ + public static record LoadLLVMImpl(ValLLVM val) implements ExpressionLLVM{ @Override public S accept(ExpressionLLVMVisitor v, H h) { return v.visitLoadLLVM(this, h); @@ -161,7 +161,7 @@ public class ProgramLLVM { @Override public TypeLLVM getType() { - return type; + return val().getType(); } } From 2f16120dae2063a9c615c5f017d8cb03b120d737 Mon Sep 17 00:00:00 2001 From: Rochas Date: Sun, 13 Apr 2025 12:36:39 +0200 Subject: [PATCH 2/3] correction bug id des var temp dans le while --- src/main/java/TP2/asd/SymTable.java | 6 +++++ src/main/java/TP2/asd/toLLVM_Visitor.java | 8 ++++-- src/main/java/TP2/llvm/Interface.java | 3 --- .../TP2/llvm/PrettyprinterLLVM_Visitor.java | 20 +------------- src/main/java/TP2/llvm/ProgramLLVM.java | 26 +------------------ 5 files changed, 14 insertions(+), 49 deletions(-) diff --git a/src/main/java/TP2/asd/SymTable.java b/src/main/java/TP2/asd/SymTable.java index 5830d6d..e408b17 100644 --- a/src/main/java/TP2/asd/SymTable.java +++ b/src/main/java/TP2/asd/SymTable.java @@ -61,10 +61,16 @@ public class SymTable { return new Result(newSymTab,newVar); } + //retourne le nom de la var déjà déclaré avec son id public String getVar(String nomVar){ return nomVar + this.stackMap.getLast().get(nomVar).id; } + //retourne le type de la var + public Type getType(String nomVar){ + return this.stackMap.getLast().get(nomVar).type; + } + public PStack> next_layer(){ return stackMap.plus(HashTreePMap.empty()); } diff --git a/src/main/java/TP2/asd/toLLVM_Visitor.java b/src/main/java/TP2/asd/toLLVM_Visitor.java index fafb063..fcd8d64 100644 --- a/src/main/java/TP2/asd/toLLVM_Visitor.java +++ b/src/main/java/TP2/asd/toLLVM_Visitor.java @@ -137,7 +137,12 @@ public class toLLVM_Visitor implements ProgramVisitor @Override public ArrayList visitRead(ReadImp instr, SymTable h) { ArrayList l = new ArrayList<>(); - l.add(new ReadLLVMImpl(new ArrayList())); //TODO + for(int i = 0; i ValLLVM val = temp.val; //temp6 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,labelDo,labelDone)); diff --git a/src/main/java/TP2/llvm/Interface.java b/src/main/java/TP2/llvm/Interface.java index 106b41b..f2ba575 100644 --- a/src/main/java/TP2/llvm/Interface.java +++ b/src/main/java/TP2/llvm/Interface.java @@ -32,9 +32,6 @@ public interface Interface { public S visitStoreLLVM(StoreLLVMImpl instr, H h); public S visitPrintLLVM(PrintLLVMImpl instr, H h); public S visitReadLLVM(ReadLLVMImpl instr, H h); - public S visitIfThenElseLLVM(IfThenElseLLVMImp instr, H h); - public S visitIfThenLLVM(IfThenLLVMImp instr, H h); - public S visitWhileLLVM(WhileLLVMImp instr, H h); public S visitLabelLLVM(LabelLLVMImp instr, H h); public S visitBrLLVM(BrLLVMImp instr, H h); public S visitBrCondLLVM(BrCondLLVMImp instr, H h); diff --git a/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java b/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java index 8c829cc..aaa0df2 100644 --- a/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java +++ b/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java @@ -115,7 +115,7 @@ TypeLLVMVisitor @Override public String visitReadLLVM(ReadLLVMImpl instr, String h) { - return INDENT+"call " + "...TODO..." +" scanf " + "...TODO..."; + return INDENT+"call " + instr.var().type().accept(this,h) + "(" + "i8*, ..." + ")" + " scanf(i8* " + "...TODO..." + ")"; } //label @@ -134,24 +134,6 @@ TypeLLVMVisitor return INDENT+"br " + instr.var().type().accept(this, h) +" "+ instr.var().accept(this, h) + ", label %" + instr.label() + ", label %" + instr.labelElse() ; } - - @Override - public String visitIfThenElseLLVM(IfThenElseLLVMImp instr, String h) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'visitIfThenElseLLVM'"); - } - - @Override - public String visitIfThenLLVM(IfThenLLVMImp instr, String h) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'visitIfThenLLVM'"); - } - - @Override - public String visitWhileLLVM(WhileLLVMImp instr, String h) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'visitWhileLLVM'"); - } @Override diff --git a/src/main/java/TP2/llvm/ProgramLLVM.java b/src/main/java/TP2/llvm/ProgramLLVM.java index c2522db..9068454 100644 --- a/src/main/java/TP2/llvm/ProgramLLVM.java +++ b/src/main/java/TP2/llvm/ProgramLLVM.java @@ -81,7 +81,7 @@ public class ProgramLLVM { } } - public static record ReadLLVMImpl(ArrayList l) implements InstructionLLVM{ + public static record ReadLLVMImpl(VarLLVMImpl var) implements InstructionLLVM{ @Override public S accept(InstructionLLVMVisitor v, H h) { @@ -89,30 +89,6 @@ public class ProgramLLVM { } } - public static record IfThenLLVMImp(ExpressionLLVM cond, InstructionLLVM instr) implements InstructionLLVM{ - @Override - public S accept(InstructionLLVMVisitor v, H h) { - return v.visitIfThenLLVM(this, h); - } - - } - - public static record IfThenElseLLVMImp(ExpressionLLVM cond, InstructionLLVM intr1, InstructionLLVM instr2) implements InstructionLLVM{ - - @Override - public S accept(InstructionLLVMVisitor v, H h) { - return v.visitIfThenElseLLVM(this, h); - } - } - - public static record WhileLLVMImp(ExpressionLLVM cond, InstructionLLVM instr) implements InstructionLLVM{ - - @Override - public S accept(InstructionLLVMVisitor v, H h) { - return v.visitWhileLLVM(this, h); - } - } - //Expression : public static record BinOpLLVMImpl(TypeLLVM type,Op op, ValLLVM val1,ValLLVM val2) implements ExpressionLLVM{ @Override From 9ef84876f7512f7b05aebbd9c4c69a97d1a92c96 Mon Sep 17 00:00:00 2001 From: Rochas Date: Sun, 13 Apr 2025 16:00:06 +0200 Subject: [PATCH 3/3] avancement sur Read et Print, todo : @.ftm --- src/main/java/TP2/asd/toLLVM_Visitor.java | 9 +++-- src/main/java/TP2/llvm/Interface.java | 3 +- .../TP2/llvm/PrettyprinterLLVM_Visitor.java | 36 +++++++++++++++---- src/main/java/TP2/llvm/ProgramLLVM.java | 22 +++++++++--- 4 files changed, 55 insertions(+), 15 deletions(-) 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); + } + } }