diff --git a/src/main/java/TP2/Main.java b/src/main/java/TP2/Main.java index f347788..b83d790 100644 --- a/src/main/java/TP2/Main.java +++ b/src/main/java/TP2/Main.java @@ -47,9 +47,9 @@ public class Main { // Pretty-print the program (to debug parsing) //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"); + //System.out.println("\n\n PRETTYPRINTER VSL : \n--------------\n"); + System.out.println(ast.prettyprinter()); + //System.out.println("\n\n PRETTYPRINTER VSL : \n--------------\n"); // Verify the program semantic // Generate the intermediate representation diff --git a/src/main/java/TP2/VSL.java b/src/main/java/TP2/VSL.java deleted file mode 100644 index db1835e..0000000 --- a/src/main/java/TP2/VSL.java +++ /dev/null @@ -1,312 +0,0 @@ -package TP2; - -import java.util.ArrayList; -import java.util.List; - - - - -public class VSL { - - static String INDENT = " "; - - sealed interface Prog{} - sealed interface Fonction{ - String toString(String string);} - sealed interface Instr permits Return,Bloc,Aff,Print,Read,IfThen,IfThenElse,While { - String toString(String string);} - sealed interface Type permits INT,VOID {} - sealed interface ListDecl{ - String toString(String string);} - sealed interface ListPar{} - sealed interface ListInstr{ - String toString(String string);} - sealed interface Par{} - sealed interface Expression{ - Type getType(); - } - sealed static interface Op{} - sealed interface Var extends Expression{ - }; - sealed interface Val extends Expression{ - }; - - - - public static void main(String[] args) { - - Add ADD = new Add(); - Modulo MODULO = new Modulo(); - - Expression exp1 = new BinOp(ADD,new BinOp(ADD,new ValInt(0),new ValInt(1)),new ValInt(2)); - ListPar param = new ListParImpl(new ArrayList<>()); - ArrayList l = new ArrayList<>(); - l.add(new Return(exp1)); - Fonction f = new FonctionImpl(new VOID(),"main",param,l); - - Prog p1 = new ProgImpl(List.of(f)); - - System.out.println(p1.toString()); - - System.out.println("\n"); - - - Var a = new VarInt("a"); - Var b = new VarInt("b"); - Prog p2 = new ProgImpl(List.of( - f, - new FonctionImpl(new INT(),"maFonction",new ListParImpl(List.of(new ParImpl(new INT(),a),new ParImpl(new INT(),b) )),List.of( - new IfThenElse(a,List.of( - new Print(List.of("a = ",a)) - ),List.of( - new Print(List.of("b = ",b)) - )), - new While(b, List.of( - new Aff(b, new BinOp(MODULO,b,new ValInt(2))) - )), - new Return(new BinOp(ADD,a,b)) - )) - - - - )); - - System.out.println(p2.toString()); - } - - - record ProgImpl(List fonctions) implements Prog{ - public String toString(){ - String str =""; - for(int i = 0; i instrs) implements Fonction{ - public String toString(String indent){ - String str = indent+"FUNC " + type.toString()+ " " + nom +" ("+param.toString()+"){\n"; - for(int i = 0; i listDecls, ListInstr instrs) implements Instr{ - public String toString(String indent){ - String str = indent +"{\n"; - for(int i = 0; i items) implements Instr{ //TODO pas bon - public String toString(String indent){ - String str = indent + "READ"; - for(int i = 0; i instrs) implements Instr{ - public String toString(String indent){ - String str = indent + "IF " + cond.toString() + "\n" + indent + "THEN\n"; - for(int i = 0; i< instrs.size(); i++){ - str += instrs.get(i).toString(indent+INDENT) + "\n"; - if(i instrs1, List instrs2) implements Instr{ - public String toString(String indent){ - String str = indent + "IF " + cond.toString() + "\n" + indent + "THEN\n"; - for(int i = 0; i< instrs1.size(); i++){ - str += instrs1.get(i).toString(indent+INDENT) + "\n"; - } - str += indent + "ELSE\n"; - for(int i = 0; i< instrs2.size(); i++){ - str += instrs2.get(i).toString(indent+INDENT); - if(i instrs) implements Instr{ - public String toString(String indent){ - String str = indent + "WHILE " + cond.toString() +"\n" + indent +"DO{\n"; - for(int i = 0; i< instrs.size(); i++){ - str += instrs.get(i).toString(indent+INDENT) + "\n"; - } - str += indent + "}"; - return str; - } - } - - record INT() implements Type{ - public String toString(){ - return "INT"; - } - } - - record VOID() implements Type{ - public String toString(){ - return "VOID"; - } - } - - record ListDeclImpl(Type type, List vars) implements ListDecl{ //erreur - public String toString(String indent){ - String str = indent + type.toString() + " "; - for(int i = 0; i pars) implements ListPar{ - public String toString(){ - String str = ""; - for(int i = 0; i instrs) implements ListInstr{ - public String toString(String indent){ - String str = ""; - for(int i = 0; i fonctions) implements ProgramI{ public S accept(ProgramVisitor v, H h) { return v.visitProgram(this, h); @@ -106,77 +104,4 @@ public class Program{ return v.visitInt(this, h); } } - - - //Eval - public static class ProgramEval implements ProgramVisitor { - @Override - public Integer visitProgram(ProgramImp e, SymTable h) { - Integer result = null; - SymTable symtable = new SymTable(); - FunctionEval functionEval = new FunctionEval(); - for (Function function : e.fonctions()) { - result = function.accept(functionEval, h); - } - return result; - } - } - - - public static class FunctionEval implements FunctionVisitor { - - @Override - public Integer visitFunction(FunctionImp e, SymTable h) { - h.next_layer(); - InstructionEval instructionEval = new InstructionEval(); - Integer result = null; - for (Instruction instr : e.instructions()) { - result = instr.accept(instructionEval, h); - } - return result; - } - } - - - public static class InstructionEval implements InstrVisitor{ - - @Override - public Integer visitReturn(Return_instrImp e, SymTable h) { - return e.accept(this, h); - } - @Override - public Integer visitAssign(AssignImp e, SymTable h) { - return e.accept(this, h); - } - @Override - public Integer visitDeclaration(DeclarationImp e, SymTable h) { - return e.accept(this, h); - } - } - - - public static class ExprEval implements ExprVisitor{ - public Integer visitConst(ConstImp c, SymTable h){ - return c.c(); - } - - public Integer visitBinOp(BinopExpressionImp e, SymTable h) { - switch(e.op()) { - case Op.PLUS: return e.e1().accept(this, h)+e.e2().accept(this, h); - case Op.MINUS: return e.e1().accept(this, h)-e.e2().accept(this, h); - case Op.TIMES: return e.e1().accept(this, h)*e.e2().accept(this, h); - case Op.DIV: return e.e1().accept(this, h)/e.e2().accept(this, h); - case Op.MOD: return e.e1().accept(this, h)%e.e2().accept(this, h); - default: throw new IllegalArgumentException(); - } - } - - public Integer visitVar(VarImp v, SymTable h) { - if (h.searchVar(v.name())) { - return 0; - } else { - throw new IllegalArgumentException(); - } - } - } } diff --git a/src/main/java/TP2/asd/toLLVM_Visitor.java b/src/main/java/TP2/asd/toLLVM_Visitor.java index cc5dbdb..be48c46 100644 --- a/src/main/java/TP2/asd/toLLVM_Visitor.java +++ b/src/main/java/TP2/asd/toLLVM_Visitor.java @@ -90,7 +90,7 @@ public class toLLVM_Visitor implements ProgramVisitor 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())); + InstructionLLVM r = new StoreLLVMImp(var.getType(),var,var.getType(),new VarLLVMImpl(var.getType(),instr.t()/*"h.getVar(instr.t())*/)); result.add(r); return result; } @@ -100,7 +100,7 @@ public class toLLVM_Visitor implements ProgramVisitor ArrayList list = new ArrayList<>(); for(int i = 0; i declration ,ArrayList fonctions) implements ProgLLVM{ public S accept(ProgramLLVMVisitor v, H h) {