diff --git a/NULL b/NULL index a2721b4..b6fa581 100644 --- a/NULL +++ b/NULL @@ -1,4 +1,4 @@ -tests\testsAdvanced\portee3.ll:20:4: error: multiple definition of local value named 'null' - 20 | %null = alloca i32 - | ^ +tests\testsAdvanced\hanoi.ll:62:1: error: expected instruction opcode + 62 | fi3: + | ^ 1 error generated. diff --git a/src/main/java/TP2/Main.java b/src/main/java/TP2/Main.java index 604cdc9..701f93b 100644 --- a/src/main/java/TP2/Main.java +++ b/src/main/java/TP2/Main.java @@ -62,12 +62,14 @@ public class Main { // Pretty-print the program (to debug parsing) + if(!TESTAUTOMOD) System.out.println("\nVSL:\n"); + if(!TESTAUTOMOD) System.out.println(ast.prettyprinter()); // Verify the program semantic // Generate the intermediate representation - if(!TESTAUTOMOD) System.out.println("\n\n"); + if(!TESTAUTOMOD) System.out.println("\nLLVM:\n"); ProgramLLVMImp astLLVM = ast.toLLVM(); diff --git a/src/main/java/TP2/asd/SymTable.java b/src/main/java/TP2/asd/SymTable.java index f4d30e6..53620e8 100644 --- a/src/main/java/TP2/asd/SymTable.java +++ b/src/main/java/TP2/asd/SymTable.java @@ -85,19 +85,27 @@ public class SymTable { public SymTable addFunction(DefineLLVMImp function, Boolean isProto){ ValueFunMap value = this.functionsMap.get(function.name()); if(value == null || (value!=null && value.isProto && !isProto)){ + if(value!=null && value.isProto && (value.define.type().getClass() != function.type().getClass() || value.define.params().size() != function.params().size())){ + System.err.println("[VSL compile error] : La fonction '"+function.name()+"()' est incompatible avec le Proto déjà déclaré"); + System.exit(1); + } return new SymTable(this.varMap, this.functionsMap.plus(function.name(),new ValueFunMap(function,isProto)), this.id,this.declarationsGlobal); } else{ if(value.isProto) System.err.println("[VSL compile error] : Le prototype '"+function.name()+"()' existe déjà"); else if(isProto) System.err.println("[VSL compile error] : Le prototype '"+function.name()+"()' doit être déclaré avant son implémentation"); else System.err.println("[VSL compile error] : La fonction '"+function.name()+"()' existe déjà"); + System.exit(1); return null; } } public ValueFunMap getFunction(String name){ ValueFunMap f = this.functionsMap.get(name); - if (f==null) System.err.println("[VSL compile error] : la fonction '" + name + "()' n'existe pas, veuillez vous assurer de l'avoir déclarée avant l'appel"); + if (f==null){ + System.err.println("[VSL compile error] : la fonction '" + name + "()' n'existe pas, veuillez vous assurer de l'avoir déclarée avant l'appel"); + System.exit(1); + } return f; } @@ -146,7 +154,8 @@ public class SymTable { PMap top = varMap.get(0); if (top.containsKey(nomVar)) { if(!top.get(nomVar).isParam){ //si non on écrase, on a plus besoin du param après - System.err.println("[VSL compile error] : '" + nomVar+ "' Erreur"); + System.err.println("[VSL compile error] : '" + nomVar+ "' a déjà été déclaré"); + System.exit(1); return new Result(this, null); } } @@ -172,6 +181,7 @@ public class SymTable { } } System.err.println("[VSL compile error] : '" + nomVar + "' n'a pas été déclaré"); + System.exit(1); return null; } @@ -182,6 +192,7 @@ public class SymTable { } } System.err.println("[VSL compile error] : '" + nomVar+"' n'est pas trouvé"); + System.exit(1); return false; } diff --git a/src/main/java/TP2/asd/toLLVM_Visitor.java b/src/main/java/TP2/asd/toLLVM_Visitor.java index 1b2bec2..16a1887 100644 --- a/src/main/java/TP2/asd/toLLVM_Visitor.java +++ b/src/main/java/TP2/asd/toLLVM_Visitor.java @@ -96,7 +96,11 @@ public class toLLVM_Visitor implements ProgramVisitor, @Override public DefineLLVMImp visitPrototype(PrototypeImp fun, SymTable h) { - return new DefineLLVMImp(fun.nom(), fun.type().accept(this, h), null,null); + ArrayList params = new ArrayList<>(); + for(VarImp param: fun.params()){ + params.add(new VarLLVMImp(new IntLLVMImp(),param.name(),false)); + } + return new DefineLLVMImp(fun.nom(), fun.type().accept(this, h), params,null); } //DECLARATION @@ -196,6 +200,10 @@ public class toLLVM_Visitor implements ProgramVisitor, ArrayList result = new ArrayList<>(); result.addAll(res.instrs); //InstructionLLVM r = new AssignLLVMImp(new VarLLVMImpl(var.getType(),instr.t()),var); + if(var.getType().getClass() != h.getType(instr.t()).getClass()){ + System.err.println("[VSL compile error] : Erreur de typage"); + System.exit(1); + } InstructionLLVM r = new StoreLLVMImp(var.getType(),var,new VarLLVMImp(var.getType(),h.getVar(instr.t()),false)); result.add(r); return result; diff --git a/tests/fragment0/add0 b/tests/fragment0/add0 index 517b2b7..1fe9149 100755 Binary files a/tests/fragment0/add0 and b/tests/fragment0/add0 differ diff --git a/tests/fragment0/add1 b/tests/fragment0/add1 index e7085c9..dd9dce2 100755 Binary files a/tests/fragment0/add1 and b/tests/fragment0/add1 differ diff --git a/tests/fragment0/const0 b/tests/fragment0/const0 index 93e416c..cc66346 100755 Binary files a/tests/fragment0/const0 and b/tests/fragment0/const0 differ diff --git a/tests/fragment0/const1 b/tests/fragment0/const1 index 3cf8124..169f011 100755 Binary files a/tests/fragment0/const1 and b/tests/fragment0/const1 differ diff --git a/tests/fragment0/div0 b/tests/fragment0/div0 index 0cedace..586b468 100755 Binary files a/tests/fragment0/div0 and b/tests/fragment0/div0 differ diff --git a/tests/fragment0/div1 b/tests/fragment0/div1 index 1cd23e3..ade379c 100755 Binary files a/tests/fragment0/div1 and b/tests/fragment0/div1 differ diff --git a/tests/fragment0/mod b/tests/fragment0/mod index 1bfcf74..f00d181 100755 Binary files a/tests/fragment0/mod and b/tests/fragment0/mod differ diff --git a/tests/fragment0/mult1 b/tests/fragment0/mult1 index cc7d7bd..afe05f6 100755 Binary files a/tests/fragment0/mult1 and b/tests/fragment0/mult1 differ diff --git a/tests/fragment0/mult2 b/tests/fragment0/mult2 index 0f7e296..53e1a1c 100755 Binary files a/tests/fragment0/mult2 and b/tests/fragment0/mult2 differ diff --git a/tests/fragment0/paren b/tests/fragment0/paren index 9b91d56..64fd9c7 100755 Binary files a/tests/fragment0/paren and b/tests/fragment0/paren differ diff --git a/tests/fragment0/priority1 b/tests/fragment0/priority1 index 2befceb..f12f1cb 100755 Binary files a/tests/fragment0/priority1 and b/tests/fragment0/priority1 differ diff --git a/tests/fragment0/priority2 b/tests/fragment0/priority2 index 78ef7ae..6d9debd 100755 Binary files a/tests/fragment0/priority2 and b/tests/fragment0/priority2 differ diff --git a/tests/fragment0/sub0 b/tests/fragment0/sub0 index 086ed94..f5d2d22 100755 Binary files a/tests/fragment0/sub0 and b/tests/fragment0/sub0 differ diff --git a/tests/fragment0/sub1 b/tests/fragment0/sub1 index fd7eda3..2774b98 100755 Binary files a/tests/fragment0/sub1 and b/tests/fragment0/sub1 differ diff --git a/tests/fragment1/assign1 b/tests/fragment1/assign1 index ef4eb30..d200d19 100755 Binary files a/tests/fragment1/assign1 and b/tests/fragment1/assign1 differ diff --git a/tests/fragment1/assign2 b/tests/fragment1/assign2 index f2b3992..38bc634 100755 Binary files a/tests/fragment1/assign2 and b/tests/fragment1/assign2 differ diff --git a/tests/fragment1/block b/tests/fragment1/block index 21099c9..6bf7478 100755 Binary files a/tests/fragment1/block and b/tests/fragment1/block differ diff --git a/tests/fragment1/decl b/tests/fragment1/decl index fe41532..60a0cb6 100755 Binary files a/tests/fragment1/decl and b/tests/fragment1/decl differ diff --git a/tests/fragment1/hello_world b/tests/fragment1/hello_world index 0f6aa9e..188e33b 100755 Binary files a/tests/fragment1/hello_world and b/tests/fragment1/hello_world differ diff --git a/tests/fragment1/if1 b/tests/fragment1/if1 index 5f24bf0..8b0242b 100755 Binary files a/tests/fragment1/if1 and b/tests/fragment1/if1 differ diff --git a/tests/fragment1/if2 b/tests/fragment1/if2 index 5f24bf0..1a50677 100755 Binary files a/tests/fragment1/if2 and b/tests/fragment1/if2 differ diff --git a/tests/fragment1/print1 b/tests/fragment1/print1 index dba49f3..785d70c 100755 Binary files a/tests/fragment1/print1 and b/tests/fragment1/print1 differ diff --git a/tests/fragment1/print2 b/tests/fragment1/print2 index dc81c67..41730f4 100755 Binary files a/tests/fragment1/print2 and b/tests/fragment1/print2 differ diff --git a/tests/fragment1/print3 b/tests/fragment1/print3 index e116db0..154cbb1 100755 Binary files a/tests/fragment1/print3 and b/tests/fragment1/print3 differ diff --git a/tests/fragment1/print4 b/tests/fragment1/print4 index add719e..8faade0 100755 Binary files a/tests/fragment1/print4 and b/tests/fragment1/print4 differ diff --git a/tests/fragment1/sequence b/tests/fragment1/sequence index 8d21d2f..5c8c446 100755 Binary files a/tests/fragment1/sequence and b/tests/fragment1/sequence differ diff --git a/tests/fragment1/while1 b/tests/fragment1/while1 index c9ad8db..0c0c862 100755 Binary files a/tests/fragment1/while1 and b/tests/fragment1/while1 differ diff --git a/tests/fragment1/while2 b/tests/fragment1/while2 index a8f9a77..3bb9329 100755 Binary files a/tests/fragment1/while2 and b/tests/fragment1/while2 differ diff --git a/tests/fragment2/call b/tests/fragment2/call index 6ff922f..8a2f61f 100755 Binary files a/tests/fragment2/call and b/tests/fragment2/call differ diff --git a/tests/fragment2/call2 b/tests/fragment2/call2 index 61f7b7d..38e42ae 100755 Binary files a/tests/fragment2/call2 and b/tests/fragment2/call2 differ diff --git a/tests/fragment2/call3expr b/tests/fragment2/call3expr index 0e863ae..55ae6e5 100755 Binary files a/tests/fragment2/call3expr and b/tests/fragment2/call3expr differ diff --git a/tests/fragment2/call4if b/tests/fragment2/call4if index b90010b..351a31b 100755 Binary files a/tests/fragment2/call4if and b/tests/fragment2/call4if differ diff --git a/tests/fragment2/proto1 b/tests/fragment2/proto1 index 381c3f4..3cc91b4 100755 Binary files a/tests/fragment2/proto1 and b/tests/fragment2/proto1 differ diff --git a/tests/fragment2/proto2 b/tests/fragment2/proto2 index b3f19bb..f50137f 100755 Binary files a/tests/fragment2/proto2 and b/tests/fragment2/proto2 differ diff --git a/tests/testsAdvanced/carre b/tests/testsAdvanced/carre index 70c8d16..9d86135 100755 Binary files a/tests/testsAdvanced/carre and b/tests/testsAdvanced/carre differ diff --git a/tests/testsAdvanced/diverge b/tests/testsAdvanced/diverge index 8b168f6..21bedf3 100755 Binary files a/tests/testsAdvanced/diverge and b/tests/testsAdvanced/diverge differ diff --git a/tests/testsAdvanced/divergeDifficile b/tests/testsAdvanced/divergeDifficile index adf6a5c..38bbea8 100755 Binary files a/tests/testsAdvanced/divergeDifficile and b/tests/testsAdvanced/divergeDifficile differ