diff --git a/src/main/java/TP2/Main.java b/src/main/java/TP2/Main.java index 422f852..75af21c 100644 --- a/src/main/java/TP2/Main.java +++ b/src/main/java/TP2/Main.java @@ -1,6 +1,9 @@ package TP2; import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; import org.antlr.runtime.ANTLRFileStream; import org.antlr.runtime.ANTLRInputStream; @@ -64,6 +67,7 @@ public class Main { // Generate the intermediate representation //System.out.println("\n\n"); + //PrintWriter out2 = new PrintWriter(new OutputStreamWriter(System.out, StandardCharsets.UTF_8), true); ProgramLLVMImp astLLVM = ast.toLLVM(); //System.out.println("\n\n PRETTYPRINTER LLVM : \n--------------\n"); diff --git a/src/main/java/TP2/asd/SymTable.java b/src/main/java/TP2/asd/SymTable.java index 9dc1ac0..f4d30e6 100644 --- a/src/main/java/TP2/asd/SymTable.java +++ b/src/main/java/TP2/asd/SymTable.java @@ -145,8 +145,10 @@ public class SymTable { public Result addVar(String nomVar, TypeLLVM type) { PMap top = varMap.get(0); if (top.containsKey(nomVar)) { - System.err.println("[VSL compile error] : '" + nomVar+ "' Erreur"); - return new Result(this, null); + 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"); + return new Result(this, null); + } } String realName = nomVar + "_" + id[0]; top = top.plus(nomVar, new ValueVarMap(type, id[0], false)); diff --git a/src/main/java/TP2/asd/toLLVM_Visitor.java b/src/main/java/TP2/asd/toLLVM_Visitor.java index e02f95a..4223f8d 100644 --- a/src/main/java/TP2/asd/toLLVM_Visitor.java +++ b/src/main/java/TP2/asd/toLLVM_Visitor.java @@ -65,13 +65,22 @@ public class toLLVM_Visitor implements ProgramVisitor, public DefineLLVMImp visitFunction(FunctionImp fun, SymTable h) { ArrayList instrLLVM = new ArrayList<>(); ArrayList paramsLLVM = new ArrayList<>(); + ArrayList setParam = new ArrayList<>(); for(VarImp param: fun.params()){ + TypeLLVM type = new IntLLVMImp(); Result r = h.addParam(param.name()); - String name = r.var; - VarLLVMImp var = new VarLLVMImp(new IntLLVMImp(), name,false); + String nameParam = r.var; h = r.symTable; + Result r2 = h.addVar(param.name(),type); + String nameVar = r2.var; + h = r2.symTable; + VarLLVMImp var = new VarLLVMImp(type, nameParam,false); paramsLLVM.add(var); + VarLLVMImp newVar =new VarLLVMImp(type, nameVar,false); + setParam.add(new AssignLLVMImp(newVar,new allocaLLVMImp(type))); + setParam.add(new StoreLLVMImp(type,var,type,newVar)); } + instrLLVM.addAll(setParam); instrLLVM.addAll(fun.instruction().accept(this, h)); TypeLLVM type = fun.type().accept(this, h); if(!(type instanceof VoidLLVMImp)){ //on ajoute un return 0 si la fonction n'est pas un void, et ne finit ni par un return ni pas un goto (sans condition) diff --git a/tests/fragment1/while1 b/tests/fragment1/while1 index 1c53604..9709d1a 100755 Binary files a/tests/fragment1/while1 and b/tests/fragment1/while1 differ diff --git a/tests/fragment1/while2 b/tests/fragment1/while2 index f0013e8..e2fcb92 100755 Binary files a/tests/fragment1/while2 and b/tests/fragment1/while2 differ