From b9b609f1e2874440df9924452fd61460948b2dc8 Mon Sep 17 00:00:00 2001 From: Rochas Date: Sat, 5 Apr 2025 20:11:52 +0200 Subject: [PATCH] =?UTF-8?q?toLLVM=20en=20visitor,=20todo=20:=20r=C3=A9pare?= =?UTF-8?q?r=20la=20Declaration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/TP2/asd/Interface.java | 10 +- .../java/TP2/asd/PrettyprinterVisitor.java | 43 +++---- src/main/java/TP2/asd/Program.java | 91 ++------------ src/main/java/TP2/asd/toLLVM_Visitor.java | 118 ++++++++++++++++++ src/main/java/TP2/llvm/Interface.java | 1 + src/main/java/TP2/llvm/ProgramLLVM.java | 12 +- 6 files changed, 159 insertions(+), 116 deletions(-) create mode 100644 src/main/java/TP2/asd/toLLVM_Visitor.java diff --git a/src/main/java/TP2/asd/Interface.java b/src/main/java/TP2/asd/Interface.java index 8dea2b0..a7c21ab 100644 --- a/src/main/java/TP2/asd/Interface.java +++ b/src/main/java/TP2/asd/Interface.java @@ -23,7 +23,6 @@ public interface Interface{ //////////Function public interface Function { public S accept(FunctionVisitor v, H h); - public DefineLLVM toLLVM(); } public interface FunctionVisitor { @@ -34,13 +33,12 @@ public interface Interface{ //////////Instruction public interface Instruction { public S accept(InstrVisitor v, H h); - public ArrayList toLLVM(); } public interface InstrVisitor{ - public S visitReturn(Return_instrImp e, H h); - public S visitAssign(AssignImp e, H h); - public S visitDeclaration(DeclarationImp e,H h); + public S visitReturn(Return_instrImp instr, H h); + public S visitAssign(AssignImp instr, H h); + public S visitDeclaration(DeclarationImp instr,H h); } @@ -49,7 +47,6 @@ public interface Interface{ //but each implement will be different for prettyprinter public interface Expression { public S accept(ExprVisitor v, H h); - public ArrayList toLLVM(); } public interface Val extends Expression{ @@ -65,7 +62,6 @@ public interface Interface{ public interface Type{ public S accept(TypeVisitor v, H h); - public TypeLLVM toLLVM(); } public interface TypeVisitor{ diff --git a/src/main/java/TP2/asd/PrettyprinterVisitor.java b/src/main/java/TP2/asd/PrettyprinterVisitor.java index a0c70b6..87b83be 100644 --- a/src/main/java/TP2/asd/PrettyprinterVisitor.java +++ b/src/main/java/TP2/asd/PrettyprinterVisitor.java @@ -1,20 +1,7 @@ package TP2.asd; -import TP2.asd.Interface.TypeVisitor; -import TP2.asd.Interface.ExprVisitor; -import TP2.asd.Interface.FunctionVisitor; -import TP2.asd.Interface.InstrVisitor; -import TP2.asd.Interface.ProgramVisitor; - -import TP2.asd.Program.AssignImp; -import TP2.asd.Program.BinopExpressionImp; -import TP2.asd.Program.ConstImp; -import TP2.asd.Program.DeclarationImp; -import TP2.asd.Program.FunctionImp; -import TP2.asd.Program.ProgramImp; -import TP2.asd.Program.Return_instrImp; -import TP2.asd.Program.Type_intImp; -import TP2.asd.Program.Type_voidImp; +import TP2.asd.Interface.*; +import TP2.asd.Program.*; public class PrettyprinterVisitor implements ProgramVisitor, FunctionVisitor, @@ -25,6 +12,8 @@ public class PrettyprinterVisitor implements ProgramVisitor, static String INDENT = " "; + //PROGRAM + @Override public String visitProgram(ProgramImp prog, String indent) { String str =""; @@ -35,6 +24,8 @@ public class PrettyprinterVisitor implements ProgramVisitor, return str; } + //FUNCTION + @Override public String visitFunction(FunctionImp fun, String indent) { String str = indent+"FUNC " + fun.type().accept(this,"")+ " " + fun.nom() +"(){\n"; @@ -45,25 +36,29 @@ public class PrettyprinterVisitor implements ProgramVisitor, return str; } + //INSTRUCTION + @Override - public String visitReturn(Return_instrImp e, String indent) { - return indent+"RETURN " + e.e().accept(this,""); + public String visitReturn(Return_instrImp instr, String indent) { + return indent+"RETURN " + instr.e().accept(this,""); } @Override - public String visitAssign(AssignImp e, String indent) { - return e.t()+ " :=" + e.e().accept(this,""); + public String visitAssign(AssignImp instr, String indent) { + return instr.t()+ " :=" + instr.e().accept(this,""); } @Override - public String visitDeclaration(DeclarationImp e, String indent) { - String str = indent + "declare "+e.t().accept(this,"") + " "; - for(int i = 0; i, return "(" + e.e1().accept(this,"") +" "+ opStr +" " + e.e2().accept(this,"") + ")"; } + //TYPE + @Override public String visitInt(Type_intImp t, String h) { return "INT"; diff --git a/src/main/java/TP2/asd/Program.java b/src/main/java/TP2/asd/Program.java index 119874d..ae62edf 100644 --- a/src/main/java/TP2/asd/Program.java +++ b/src/main/java/TP2/asd/Program.java @@ -1,8 +1,10 @@ package TP2.asd; import java.util.ArrayList; -import java.util.List; import java.util.Map; + +import javax.swing.plaf.synth.SynthLabelUI; + import TP2.asd.Interface.*; import TP2.llvm.ProgramLLVM.*; import TP2.llvm.Interface.*; @@ -24,11 +26,13 @@ public class Program{ @Override public ProgramLLVMImpl toLLVM() { - ArrayList fonctionLLVM = new ArrayList<>(); + /**ArrayList fonctionLLVM = new ArrayList<>(); for(int i = 0; i(),fonctionLLVM); + return new ProgramLLVMImpl(new ArrayList<>(),fonctionLLVM);*/ + toLLVM_Visitor llvmVisitor = new toLLVM_Visitor(); + return this.accept(llvmVisitor,new SymTable()); } @@ -43,15 +47,6 @@ public class Program{ public S accept(FunctionVisitor v, H h) { return v.visitFunction(this, h); } - - @Override - public DefineLLVM toLLVM() { - ArrayList instrLLVM = new ArrayList<>(); - for(int i = 0; i toLLVM() { //TODO - // TODO Auto-generated method stub - ArrayList list = new ArrayList<>(); - ValLLVM cLLVM = new ValLLVMImpl(new IntLLVMImpl(),c); - list.add(new AssignLVMImp(new VarLLVMImpl(new IntLLVMImpl(),"todo"), cLLVM)); - return list; - } } @@ -81,32 +68,6 @@ public class Program{ return v.visitBinOp(this, h); } - @Override - public ArrayList toLLVM() { //TODO si e1 ou e2 est une constante, elle doit pouvoir ĂȘtre mise directement dans l'expression - ArrayList list = new ArrayList<>(); - ValLLVM val1 = null; - ValLLVM val2 = null; - if(e1 instanceof Val){ - val1 = ((Val) e1).getValLLVM(); - } - else { - ArrayList eLLVM1 = e1.toLLVM(); - list.addAll(eLLVM1); - val1 = eLLVM1.getLast().getVar(); - } - if(e2 instanceof Val){ - val2 = ((Val) e2).getValLLVM(); - } - else { - ArrayList eLLVM2 = e2.toLLVM(); - list.addAll(eLLVM2); - val2 = eLLVM2.getLast().getVar(); - } - - list.add(new AssignLVMImp(new VarLLVMImpl(new IntLLVMImpl()/*TODO*/,"todo"), new BinOpLLVMImp(new IntLLVMImpl()/*TODO*/,op,val1,val2))); - - return list; - } } @@ -116,16 +77,6 @@ public class Program{ return v.visitReturn(this,h); } - @Override - public ArrayList toLLVM() { - ArrayList list = e.toLLVM(); - InstructionLLVM r = new ReturnLLVMImp(new IntLLVMImpl()/*TODO*/,list.getLast().getVar()); - ArrayList result = new ArrayList<>(); - result.addAll(list); - result.add(r); - - return result; - } } @@ -133,30 +84,13 @@ public class Program{ public S accept(InstrVisitor v, H h) { return v.visitAssign(this, h); } - - @Override - public ArrayList toLLVM() { - ArrayList list = e.toLLVM(); - InstructionLLVM r = new AssignLVMImp(new VarLLVMImpl(new IntLLVMImpl()/*TODO*/,t),list.getLast().getVar()); - ArrayList result = new ArrayList<>(); - result.addAll(list); - result.add(r); - return result; - } } public static record DeclarationImp(Type t, ArrayList s) implements Instruction{ - @Override public S accept(InstrVisitor v, H h) { return v.visitDeclaration(this, h); } - - @Override - public ArrayList toLLVM() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'toLLVM'"); - } } //Type @@ -165,12 +99,6 @@ public class Program{ public S accept(TypeVisitor v, H h) { return v.visitVoid(this, h); } - - @Override - public TypeLLVM toLLVM() { - return new IntLLVMImpl(); - } - } @@ -179,11 +107,6 @@ public class Program{ public S accept(TypeVisitor v, H h) { return v.visitInt(this, h); } - - @Override - public TypeLLVM toLLVM() { - return new VoidLLVMImpl(); - } } diff --git a/src/main/java/TP2/asd/toLLVM_Visitor.java b/src/main/java/TP2/asd/toLLVM_Visitor.java new file mode 100644 index 0000000..9a27eef --- /dev/null +++ b/src/main/java/TP2/asd/toLLVM_Visitor.java @@ -0,0 +1,118 @@ +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; +import TP2.llvm.ProgramLLVM.*; + +public class toLLVM_Visitor implements ProgramVisitor, + FunctionVisitor, + InstrVisitor>, + ExprVisitor>, + TypeVisitor + { + + + //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) { + ArrayList list = instr.e().accept(this,h); + InstructionLLVM r = new ReturnLLVMImp(new IntLLVMImpl()/*TODO*/,list.getLast().getVar()); + ArrayList result = new ArrayList<>(); + result.addAll(list); + result.add(r); + + return result; + } + + @Override + public ArrayList visitAssign(AssignImp instr, SymTable h) { + ArrayList list = instr.e().accept(this,h); + InstructionLLVM r = new AssignLVMImp(new VarLLVMImpl(new IntLLVMImpl()/*TODO*/,instr.t()),list.getLast().getVar()); + ArrayList result = new ArrayList<>(); + result.addAll(list); + result.add(r); + return result; + } + + @Override + public ArrayList visitDeclaration(DeclarationImp instr, SymTable h) { + ArrayList list = new ArrayList<>(); + for(int i = 0; i visitConst(ConstImp e, SymTable h) { + throw new UnsupportedOperationException("Can't call toLLVM on Expression Const"); + } + + @Override + public ArrayList visitBinOp(BinopExpressionImp e, SymTable h) { + ArrayList list = new ArrayList<>(); + ValLLVM val1 = null; + ValLLVM val2 = null; + if(e.e1() instanceof Val){ + val1 = ((Val) e.e1()).getValLLVM(); + } + else { + ArrayList eLLVM1 = e.e1().accept(this,h); + list.addAll(eLLVM1); + val1 = eLLVM1.getLast().getVar(); + } + if(e.e2() instanceof Val){ + val2 = ((Val) e.e2()).getValLLVM(); + } + else { + ArrayList eLLVM2 = e.e2().accept(this,h); + list.addAll(eLLVM2); + val2 = eLLVM2.getLast().getVar(); + } + + list.add(new AssignLVMImp(new VarLLVMImpl(new IntLLVMImpl()/*TODO*/,"todo"), new BinOpLLVMImp(new IntLLVMImpl()/*TODO*/,e.op(),val1,val2))); + + return list; + } + + @Override + public TypeLLVM visitInt(Type_intImp t, SymTable h) { + return new IntLLVMImpl(); + } + + @Override + public TypeLLVM visitVoid(Type_voidImp t, SymTable h) { + return new VoidLLVMImpl(); + } + +} diff --git a/src/main/java/TP2/llvm/Interface.java b/src/main/java/TP2/llvm/Interface.java index deb9e93..432880a 100644 --- a/src/main/java/TP2/llvm/Interface.java +++ b/src/main/java/TP2/llvm/Interface.java @@ -57,6 +57,7 @@ public interface Interface { public interface TypeLLVM{ public String prettyprinter(); + public int getNbBit(); } } diff --git a/src/main/java/TP2/llvm/ProgramLLVM.java b/src/main/java/TP2/llvm/ProgramLLVM.java index 220244e..902405d 100644 --- a/src/main/java/TP2/llvm/ProgramLLVM.java +++ b/src/main/java/TP2/llvm/ProgramLLVM.java @@ -153,9 +153,9 @@ public class ProgramLLVM { }*/ - public static record allocaLLVMImpl(TypeLLVM type, int nbBits) implements ExpressionLLVM{ + public static record allocaLLVMImpl(TypeLLVM type) implements ExpressionLLVM{ public String prettyprinter(){ - return "aloca" + " i" + nbBits; + return "aloca" + " i" + type.getNbBit(); } } @@ -190,6 +190,10 @@ public class ProgramLLVM { return "i32"; } + public int getNbBit(){ + return 32; + } + } @@ -200,5 +204,9 @@ public class ProgramLLVM { return "void"; } + public int getNbBit(){ + return 0; + } + } }