correction bug pour SemanticError
This commit is contained in:
@@ -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();
|
||||
|
||||
|
||||
@@ -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<String, ValueVarMap> 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;
|
||||
}
|
||||
|
||||
|
||||
@@ -96,7 +96,11 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
||||
|
||||
@Override
|
||||
public DefineLLVMImp visitPrototype(PrototypeImp fun, SymTable h) {
|
||||
return new DefineLLVMImp(fun.nom(), fun.type().accept(this, h), null,null);
|
||||
ArrayList<VarLLVMImp> 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<SymTable,ProgramLLVMImp>,
|
||||
ArrayList<InstructionLLVM> 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;
|
||||
|
||||
Reference in New Issue
Block a user