package TP2.asd; import java.util.Stack; import org.pcollections.*; import TP2.asd.Interface.Type; import TP2.asd.Program.Type_intImp; public class SymTable { public static class ValueTable{ public Type type; public int id; public ValueTable(Type type,int id){ this.type = type; this.id = id; } } public static class Result{ public SymTable symTable; public String var; public Result(SymTable symTable, String var){ this.symTable = symTable; this.var = var; } } private PStack> stackMap; private int id=1; public int idLabel = 1; public SymTable(){ this.stackMap= ConsPStack.empty(); } public SymTable(PStack> stackMap, int id){ this.stackMap= stackMap; this.id = id; } public int getNewId(){ int a = this.id; this.id++; return a; } public int getNewIdLabel(){ int a = this.idLabel; this.idLabel++; return a; } public Result addNewTempVar(/*Type type*/){ //TODO String newVar = "temp"+id; SymTable newSymTab = this.addVar(newVar,new Type_intImp()); //TODO return new Result(newSymTab,newVar); } public Result addVar(String nomVar){ String newVar = nomVar+id; SymTable newSymTab = this.addVar(nomVar,new Type_intImp()); //TODO return new Result(newSymTab,newVar); } public String getVar(String nomVar){ return nomVar + this.stackMap.getLast().get(nomVar).id; } public PStack> next_layer(){ return stackMap.plus(HashTreePMap.empty()); } public PMap peppapeek(){ if(stackMap.isEmpty()){ return this.next_layer().getLast(); } return stackMap.getLast(); } public SymTable addVar(String s, Type t){ PStack> newpstack = null; if(this.stackMap.isEmpty()){ newpstack = this.next_layer(); } else newpstack = this.stackMap; //Save temporary if not PMap wont save PMap pmap = this.peppapeek(); pmap= pmap.plus(s/*+"_"+this.id*/,new ValueTable(t, getNewId())); //this.id++; //Delete old ones newpstack = newpstack.minus(newpstack.indexOf(newpstack.getLast())); //Push the new one newpstack = newpstack.plus(pmap); return new SymTable(newpstack,this.id); } //Usually look for var in highest level , if not found research. public boolean searchVar(String s){ //TOTO for(int i= stackMap.size()-1; i>=0; i--){ if(stackMap.get(i).containsKey(s)){ return true; } } return false; } public Stack> stackmap(){ return this.stackmap(); } public Type getvar_Type(String s){ for(int i= stackMap.size()-1; i>=0; i--){ if(stackMap.get(i).containsKey(s)){ return stackMap.get(i).get(s).type; } } return null; } public String print_all(){ StringBuilder str = new StringBuilder(); for(int i= stackMap.size()-1; i>=0; i--){ str.append("level ").append(i).append("\n"); for(String s: stackMap.get(i).keySet()){ str.append(s).append(" ").append(stackMap.get(i).get(s)).append("\n"); } } return str.toString(); } }