correction param

This commit is contained in:
Rochas
2025-04-30 12:53:55 +02:00
parent e27e112f6c
commit ad30cd3c64
5 changed files with 19 additions and 4 deletions

View File

@@ -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");

View File

@@ -145,8 +145,10 @@ public class SymTable {
public Result addVar(String nomVar, TypeLLVM type) {
PMap<String, ValueVarMap> 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));

View File

@@ -65,13 +65,22 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
public DefineLLVMImp visitFunction(FunctionImp fun, SymTable h) {
ArrayList<InstructionLLVM> instrLLVM = new ArrayList<>();
ArrayList<VarLLVMImp> paramsLLVM = new ArrayList<>();
ArrayList<InstructionLLVM> 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)