diff --git a/src/main/java/TP2/llvm/Interface.java b/src/main/java/TP2/llvm/Interface.java index b04ce61..8098f94 100644 --- a/src/main/java/TP2/llvm/Interface.java +++ b/src/main/java/TP2/llvm/Interface.java @@ -1,9 +1,4 @@ package TP2.llvm; -import TP2.asd.Program.AssignImp; -import TP2.asd.Program.BinopExpressionImp; -import TP2.asd.Program.ConstImp; -import TP2.asd.Program.ProgramImp; -import TP2.asd.Program.Return_instrImp; import TP2.llvm.ProgramLLVM.*; public interface Interface { @@ -14,51 +9,59 @@ public interface Interface { } public interface ProgramLLVMVisitor { - public S visitProgramLLVM(ProgramLLVMImpl e, H h); + public S visitProgramLLVM(ProgramLLVMImpl prog, H h); } //////////DefineLLVM (function) public interface DefineLLVM{ public S accept(DefineLLVMVisitor v, H h); - public String prettyprinter(); } public interface DefineLLVMVisitor { - public S visitProgramLLVM(DefineLLVMImpl e, H h); + public S visitDefineLLVM(DefineLLVMImpl define, H h); } public interface InstructionLLVM{ public S accept(InstructionLLVMVisitor v, H h); - public String prettyprinter(); } public interface InstructionLLVMVisitor { - public S visitReturnLLVM(ReturnLLVMImp e, H h); - public S visitAssignLLVM(AssignLVMImp e, H h); + public S visitReturnLLVM(ReturnLLVMImp instr, H h); + public S visitAssignLLVM(AssignLVMImp instr, H h); } //////////ExpressionLLVM (expression) public interface ExpressionLLVM{ - public String prettyprinter(); + public S accept(ExpressionLLVMVisitor v, H h); public TypeLLVM getType(); } - public interface ExpressionLLVMVisitor { - public S visitConstLLVM(ValLLVM e,H h); - public S visitBinOpLLVM(BinOpLLVMImp e, H h); - } - public interface ValLLVM extends ExpressionLLVM{ - public String prettyprinter(); } - public interface IdentifierLLVM{ //globaux @ et local % + public interface ExpressionLLVMVisitor { + public S visitBinOpLLVM(BinOpLLVMImp e, H h); + public S visitAllocaLLVM(allocaLLVMImpl 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 interface IdentifierLLVM{ //globaux @ et local % public String prettyprinter(); } + public interface IndentifierLLVMVisitor { + }*/ + public interface TypeLLVM{ - public String prettyprinter(); + public S accept(TypeLLVMVisitor v, H h); public int getNbBit(); } + public interface TypeLLVMVisitor { + public S visitIntLLVM(IntLLVMImpl e,H h); + public S visitVoidLLVM(VoidLLVMImpl e, H h); + } + } diff --git a/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java b/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java new file mode 100644 index 0000000..3b6d6e7 --- /dev/null +++ b/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java @@ -0,0 +1,118 @@ +package TP2.llvm; + +import TP2.llvm.Interface.*; +import TP2.llvm.ProgramLLVM.*; + +public class PrettyprinterLLVM_Visitor implements ProgramLLVMVisitor, +DefineLLVMVisitor, +InstructionLLVMVisitor, +ExpressionLLVMVisitor, +TypeLLVMVisitor +{ + static String INDENT = " "; + + @Override + public String visitProgramLLVM(ProgramLLVMImpl prog, String indent) { + 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("declare i32 @printf (i8 * noalias nocapture, ...)\n"); + str.append("declare i32 @scanf (i8 * noalias nocapture, ...)\n"); + str.append("\n"); + str.append("; Actual code begins\n"); + + // Déclaration pour les string + //for(int i = 0; i instrs) implements DefineLLVM{ public S accept(DefineLLVMVisitor v, H h) { - return v.visitProgramLLVM(this, h); - } - - /*public String type_toString(){ - switch(t.prettyprinter()){ - case "INT": - return "i32"; - case "VOID": - return "void"; - default: - throw new AssertionError(); - } - }*/ - - public String prettyprinter(){ - StringBuilder str = new StringBuilder("define "); - str.append(type.prettyprinter()).append(" @").append(nom).append("("); - - //TODO param - - str.append("){\n"); - for(InstructionLLVM instr : instrs){ - str.append(instr.prettyprinter()).append("\n"); - } - str.append("}"); - return str.toString(); + return v.visitDefineLLVM(this, h); } } @@ -93,9 +47,6 @@ public class ProgramLLVM { public S accept(InstructionLLVMVisitor v, H h) { return v.visitAssignLLVM(this, h); } - public String prettyprinter(){ - return INDENT+var.prettyprinter() + " = " + e.prettyprinter(); - } } public static record ReturnLLVMImp(TypeLLVM type, ExpressionLLVM e) implements InstructionLLVM{ @@ -103,46 +54,14 @@ public class ProgramLLVM { public S accept(InstructionLLVMVisitor v, H h) { return v.visitReturnLLVM(this, h); } - - public String prettyprinter(){ - return INDENT+"ret " + type.prettyprinter() + " " + e.prettyprinter(); - } - - } //Expression : public static record BinOpLLVMImp(TypeLLVM type,Op op, ValLLVM val1,ValLLVM val2) implements ExpressionLLVM{ + @Override public S accept(ExpressionLLVMVisitor v, H h) { return v.visitBinOpLLVM(this, h); } - public String op_toString(){ - StringBuilder str = new StringBuilder(); - switch(op){ - case PLUS: - str.append("add "); - break; - case MINUS: - str.append("sub "); - break; - case TIMES: - str.append("mul "); - break; - case DIV: - str.append("sdiv "); //division signé - break; - case MOD: - str.append("srem "); //modulo signé - break; - default: - throw new AssertionError(); - } - return str.toString(); //TODO - } - - public String prettyprinter(){ - return op_toString() + type.prettyprinter() + " " + val1.prettyprinter() + ", " + val2.prettyprinter(); - } @Override public TypeLLVM getType() { @@ -165,9 +84,11 @@ public class ProgramLLVM { public static record allocaLLVMImpl(TypeLLVM type) implements ExpressionLLVM{ - public String prettyprinter(){ - return "aloca" + " i" + type.getNbBit(); + @Override + public S accept(ExpressionLLVMVisitor v, H h) { + return v.visitAllocaLLVM(this, h); } + @Override public TypeLLVM getType() { return type; @@ -176,9 +97,11 @@ public class ProgramLLVM { public static record loadLLVMImpl(TypeLLVM type, int nbBits,int nbBits2, ValLLVM val) implements ExpressionLLVM{ - public String prettyprinter(){ - return "load" + " i" + nbBits + ", i"+ nbBits2 + "* %" + val.prettyprinter(); + @Override + public S accept(ExpressionLLVMVisitor v, H h) { + return v.visitLoadLLVM(this, h); } + @Override public TypeLLVM getType() { return type; @@ -189,8 +112,9 @@ public class ProgramLLVM { //Val public static record ValLLVMImpl(TypeLLVM type, int val) implements ValLLVM{ - public String prettyprinter(){ - return val + ""; + @Override + public S accept(ExpressionLLVMVisitor v, H h) { + return v.visitValLLVM(this, h); } @Override @@ -201,8 +125,9 @@ public class ProgramLLVM { public static record VarLLVMImpl(TypeLLVM type, String nom) implements ValLLVM{ - public String prettyprinter(){ - return "%"+nom; + @Override + public S accept(ExpressionLLVMVisitor v, H h) { + return v.visitVarLLVM(this, h); } @Override @@ -215,27 +140,25 @@ public class ProgramLLVM { public static record IntLLVMImpl() implements TypeLLVM{ @Override - public String prettyprinter() { - return "i32"; + public S accept(TypeLLVMVisitor v, H h) { + return v.visitIntLLVM(this, h); } public int getNbBit(){ return 32; } - } public static record VoidLLVMImpl() implements TypeLLVM{ @Override - public String prettyprinter() { - return "void"; + public S accept(TypeLLVMVisitor v, H h) { + return v.visitVoidLLVM(this, h); } public int getNbBit(){ return 0; } - } }