This commit is contained in:
Rochas
2025-04-30 19:41:42 +02:00
parent c8bbfc991d
commit 058ea815a1
4 changed files with 40 additions and 48 deletions

View File

@@ -4,7 +4,9 @@ import TP2.asd.Program.*;
import TP2.llvm.ProgramLLVM.*;
public interface Interface{
//PROGRAM
public interface ProgramI {
public <H,S> S accept(ProgramVisitor<H,S> v, H h);
public String prettyprinter();
@@ -15,8 +17,8 @@ public interface Interface{
public S visitProgram(ProgramImp prog, H h);
}
//FUNCTION
public interface Function {
public <H,S> S accept(FunctionVisitor<H,S> v, H h);
}
@@ -43,7 +45,6 @@ public interface Interface{
public <H,S> S accept(InstrVisitor<H,S> v, H h);
}
public interface InstrVisitor<H,S>{
public S visitReturn(Return_instrImp instr, H h);
public S visitBloc(BlocImp instr, H h);

View File

@@ -32,9 +32,6 @@ public class Program{
//Fonction
public static record FunctionImp(Type type, String nom, ArrayList<VarImp> params,Instruction instruction) implements Function {
//public FunctionImp(Type type, String name, Instruction instruction) {
// this(type, name, new ArrayList<>() {{ add(instruction); }}); C KOI ?
//}
public <H, S> S accept(FunctionVisitor<H, S> v, H h) {
return v.visitFunction(this, h);

View File

@@ -2,13 +2,10 @@ package TP2.asd;
import java.util.ArrayList;
import org.pcollections.*;
import TP2.asd.Interface.Type;
import TP2.asd.Program.Type_intImp;
import TP2.llvm.Interface.TypeLLVM;
import TP2.llvm.ProgramLLVM.DeclarGlobalLLVMImp;
import TP2.llvm.ProgramLLVM.DefineLLVMImp;
import TP2.llvm.ProgramLLVM.IntLLVMImp;
import TP2.llvm.ProgramLLVM.PointerLLVMImp;
public class SymTable {
@@ -35,6 +32,8 @@ public class SymTable {
this.declarationsGlobal = declarationsGlobal;
}
public static class ValueFunMap{
public DefineLLVMImp define;
public Boolean isProto;
@@ -56,6 +55,18 @@ public class SymTable {
}
}
public static class Result{
public SymTable symTable;
public String var;
public Result(SymTable symTable, String var){
this.symTable = symTable;
this.var = var;
}
}
//Fonction SymTable :
public SymTable newBlock() {
return new SymTable(varMap.plus(HashTreePMap.empty()), functionsMap, id,declarationsGlobal);
}
@@ -68,20 +79,11 @@ public class SymTable {
}
}
public ArrayList<DeclarGlobalLLVMImp> getDeclarationGlobal(){
return this.declarationsGlobal;
}
public static class Result{
public SymTable symTable;
public String var;
public Result(SymTable symTable, String var){
this.symTable = symTable;
this.var = var;
}
}
public SymTable addFunction(DefineLLVMImp function, Boolean isProto){
ValueFunMap value = this.functionsMap.get(function.name());
if(value == null || (value!=null && value.isProto && !isProto)){
@@ -196,14 +198,6 @@ public class SymTable {
return false;
}
public TypeLLVM getvar_Type(String s){
for (PMap<String,ValueVarMap> scope : varMap) {
if (scope.containsKey(s)) {
return scope.get(s).type;
}
}
return null;
}
//retourne le type de la var
public TypeLLVM getType(String nomVar){
@@ -216,11 +210,10 @@ public class SymTable {
}
public SymTable addVarInTab(String nomVar, TypeLLVM type, boolean isParam) {
PMap<String,ValueVarMap> top = varMap.get(0);
if (top.containsKey(nomVar)) {
System.err.println(nomVar+ " déjà déclaré.");
System.err.println("[VSL compile error] : " + nomVar+ " déjà déclaré.");
return this;
}
top = top.plus(nomVar, new ValueVarMap(type, id[0], isParam));
@@ -228,29 +221,30 @@ public class SymTable {
return new SymTable(varMap.minus(0).plus(0, top), functionsMap, id, this.declarationsGlobal);
}
public String print_all(){
StringBuilder str = new StringBuilder();
str.append("Id = ").append(id[0]).append("\n");
str.append("VARIABLES:\n");
str.append("Id = ").append(id[0]).append("\n");
str.append("VARIABLES:\n");
int scopeLevel = varMap.size();
for (PMap<String, ValueVarMap> scope : varMap) {
str.append("Block Level ").append(scopeLevel--).append(":\n");
for (String varName : scope.keySet()) {
ValueVarMap value = scope.get(varName);
str.append("Name: ").append(varName)
.append(", Id: ").append(value.id)
.append(", Type: ").append(value.type)
.append(", IsParam: ").append(value.isParam)
.append("\n");
int scopeLevel = varMap.size();
for (PMap<String, ValueVarMap> scope : varMap) {
str.append("Block Level ").append(scopeLevel--).append(":\n");
for (String varName : scope.keySet()) {
ValueVarMap value = scope.get(varName);
str.append("Name: ").append(varName)
.append(", Id: ").append(value.id)
.append(", Type: ").append(value.type)
.append(", IsParam: ").append(value.isParam)
.append("\n");
}
}
}
str.append("FUNCTIONS:\n");
for (String funcName : functionsMap.keySet()) {
str.append(" Name: ").append(funcName).append("\n");
}
str.append("FUNCTIONS:\n");
for (String funcName : functionsMap.keySet()) {
str.append(" Name: ").append(funcName).append("\n");
}
return str.toString();
return str.toString();
}
}

View File

@@ -432,10 +432,10 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
@Override
public InstrAndVal visitVar(VarImp e, SymTable h) {
ArrayList<InstructionLLVM> l =new ArrayList<>();
ValLLVM val = new VarLLVMImp(h.getvar_Type(e.name()),h.getVar(e.name()),false);
ValLLVM val = new VarLLVMImp(h.getType(e.name()),h.getVar(e.name()),false);
Result r = h.addNewTempVar();
h = r.symTable;
VarLLVMImp varTemp = new VarLLVMImp(h.getvar_Type(e.name()),r.var,false);
VarLLVMImp varTemp = new VarLLVMImp(h.getType(e.name()),r.var,false);
l.add(new AssignLLVMImp(varTemp,((ExpressionLLVM)(new LoadLLVMImp(val)))));
return new InstrAndVal(l, varTemp);
}