From b3ed282f9ac8da20720955c1c3eae556bea9468a Mon Sep 17 00:00:00 2001 From: trochas Date: Mon, 7 Apr 2025 16:06:21 +0200 Subject: [PATCH] toLLVM prettyprinter pour assign --- src/main/java/TP2/Main.java | 15 ++++++++------- src/main/java/TP2/asd/Interface.java | 1 + src/main/java/TP2/asd/PrettyprinterVisitor.java | 2 +- src/main/java/TP2/asd/toLLVM_Visitor.java | 17 ++++++++--------- src/main/java/TP2/llvm/Interface.java | 1 + .../TP2/llvm/PrettyprinterLLVM_Visitor.java | 10 ++++++++-- src/main/java/TP2/llvm/ProgramLLVM.java | 9 +++++++++ tests/aLaMain.vsl | 4 +++- 8 files changed, 39 insertions(+), 20 deletions(-) diff --git a/src/main/java/TP2/Main.java b/src/main/java/TP2/Main.java index 7dd3ebf..f347788 100644 --- a/src/main/java/TP2/Main.java +++ b/src/main/java/TP2/Main.java @@ -45,19 +45,20 @@ public class Main { ProgramImp ast = parser.program(); // Pretty-print the program (to debug parsing) - System.err.println("todo " + ast); - - System.out.println("\n\n PRETTYPRINTER VSL : \n--------------\n" + ast.prettyprinter() + "\n--------------\nFIN PRETTYPRINTER"); + //System.err.println("todo " + ast); + //System.out.println("\n\n PRETTYPRINTER LLVM : \n--------------\n"); + // System.out.println(ast.prettyprinter()); + //System.out.println("\n\n PRETTYPRINTER LLVM : \n--------------\n"); // Verify the program semantic // Generate the intermediate representation - System.out.println("todo"); + //System.out.println("todo"); ProgramLLVMImpl astLLVM = ast.toLLVM(); - - System.out.println("\n\n PRETTYPRINTER LLBD : \n--------------\n" + astLLVM.prettyprinter() + "\n--------------\nFIN PRETTYPRINTER"); - + //System.out.println("\n\n PRETTYPRINTER LLVM : \n--------------\n"); + System.out.println(astLLVM.prettyprinter()); + //System.out.println("\n\n PRETTYPRINTER LLVM : \n--------------\n"); } catch (IOException | RecognitionException e) { diff --git a/src/main/java/TP2/asd/Interface.java b/src/main/java/TP2/asd/Interface.java index e422475..4c8e8be 100644 --- a/src/main/java/TP2/asd/Interface.java +++ b/src/main/java/TP2/asd/Interface.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import TP2.asd.Program.*; +import TP2.asd.toLLVM_Visitor.InstrOrVal; import TP2.llvm.Interface.*; import TP2.llvm.ProgramLLVM.*; diff --git a/src/main/java/TP2/asd/PrettyprinterVisitor.java b/src/main/java/TP2/asd/PrettyprinterVisitor.java index d8af26d..ed2ab3b 100644 --- a/src/main/java/TP2/asd/PrettyprinterVisitor.java +++ b/src/main/java/TP2/asd/PrettyprinterVisitor.java @@ -45,7 +45,7 @@ public class PrettyprinterVisitor implements ProgramVisitor, @Override public String visitAssign(AssignImp instr, String indent) { - return instr.t()+ " :=" + instr.e().accept(this,""); + return indent + instr.t()+ " := " + instr.e().accept(this,""); } @Override diff --git a/src/main/java/TP2/asd/toLLVM_Visitor.java b/src/main/java/TP2/asd/toLLVM_Visitor.java index fcdc82d..cc5dbdb 100644 --- a/src/main/java/TP2/asd/toLLVM_Visitor.java +++ b/src/main/java/TP2/asd/toLLVM_Visitor.java @@ -85,11 +85,12 @@ public class toLLVM_Visitor implements ProgramVisitor public ArrayList visitAssign(AssignImp instr, SymTable h) { InstrOrVal res = instr.e().accept(this,h); ValLLVM var = res.getVal(); - InstructionLLVM r = new AssignLVMImp(new VarLLVMImpl(var.getType(),instr.t()),var); ArrayList result = new ArrayList<>(); if(!res.isVal()){ 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())); result.add(r); return result; } @@ -111,6 +112,12 @@ public class toLLVM_Visitor implements ProgramVisitor return new InstrOrVal(null, val); } + @Override + public InstrOrVal visitVar(VarImp e, SymTable h) { + ValLLVM val = new VarLLVMImpl(new IntLLVMImpl(), e.name()); + return new InstrOrVal(null, val); + } + @Override public InstrOrVal visitBinOp(BinopExpressionImp e, SymTable h) { ArrayList list = new ArrayList<>(); @@ -156,12 +163,4 @@ public class toLLVM_Visitor implements ProgramVisitor public TypeLLVM visitVoid(Type_voidImp t, SymTable h) { return new VoidLLVMImpl(); } - - @Override - public InstrOrVal visitVar(VarImp e, SymTable h) { - return new InstrOrVal(null, null); - } - - - } diff --git a/src/main/java/TP2/llvm/Interface.java b/src/main/java/TP2/llvm/Interface.java index 8098f94..fb78361 100644 --- a/src/main/java/TP2/llvm/Interface.java +++ b/src/main/java/TP2/llvm/Interface.java @@ -28,6 +28,7 @@ public interface Interface { public interface InstructionLLVMVisitor { public S visitReturnLLVM(ReturnLLVMImp instr, H h); public S visitAssignLLVM(AssignLVMImp instr, H h); + public S visitStoreLLVM(StoreLLVMImp instr, H h); } //////////ExpressionLLVM (expression) diff --git a/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java b/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java index 3b6d6e7..713df61 100644 --- a/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java +++ b/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java @@ -16,7 +16,7 @@ TypeLLVMVisitor StringBuilder str = new StringBuilder(); str.append("; Target\n"); str.append("target triple = \"x86_64-pc-linux-gnu\"\n"); - str.append("; ; External declaration of the printf function\n"); + str.append("; External declaration of the printf function\n"); str.append("declare i32 @printf (i8 * noalias nocapture, ...)\n"); str.append("declare i32 @scanf (i8 * noalias nocapture, ...)\n"); str.append("\n"); @@ -87,7 +87,12 @@ TypeLLVMVisitor @Override public String visitAllocaLLVM(allocaLLVMImpl e, String h) { - return "aloca" + " i" + e.type().getNbBit(); + return "alloca" + " i" + e.type().getNbBit(); + } + + @Override + public String visitStoreLLVM(StoreLLVMImp instr, String h) { + return INDENT+"store " + instr.valType().accept(this, "") + " " + instr.e().accept(this, "") + ", " + instr.varType().accept(this, "") + "* " + instr.var().accept(this,""); } @Override @@ -115,4 +120,5 @@ TypeLLVMVisitor return "void"; } + } diff --git a/src/main/java/TP2/llvm/ProgramLLVM.java b/src/main/java/TP2/llvm/ProgramLLVM.java index c8e01d8..7e7a622 100644 --- a/src/main/java/TP2/llvm/ProgramLLVM.java +++ b/src/main/java/TP2/llvm/ProgramLLVM.java @@ -42,6 +42,7 @@ public class ProgramLLVM { } */ + public static record AssignLVMImp(VarLLVMImpl var, ExpressionLLVM e) implements InstructionLLVM{ @Override public S accept(InstructionLLVMVisitor v, H h) { @@ -56,6 +57,14 @@ public class ProgramLLVM { } } + public static record StoreLLVMImp(TypeLLVM valType, ExpressionLLVM e,TypeLLVM varType, ValLLVM var) implements InstructionLLVM{ + @Override + public S accept(InstructionLLVMVisitor v, H h) { + return v.visitStoreLLVM(this, h); + } + } + + //Expression : public static record BinOpLLVMImp(TypeLLVM type,Op op, ValLLVM val1,ValLLVM val2) implements ExpressionLLVM{ @Override diff --git a/tests/aLaMain.vsl b/tests/aLaMain.vsl index 9064544..ee0b70d 100644 --- a/tests/aLaMain.vsl +++ b/tests/aLaMain.vsl @@ -1,4 +1,6 @@ FUNC INT main() { INT a,b,c - a := 2 + b:=3 + c:=1 + a := b+c RETURN 4 + 6 * 5 + a } \ No newline at end of file