package TP2.asd; import java.util.Stack; import org.pcollections.*; import TP2.asd.Interface.Type; import TP2.asd.Program.Type_intImp; public class SymTable { private PStack> stackMap; private int id=1; public SymTable(){ this.stackMap= ConsPStack.empty(); } public String addNewTempVar(/*Type type*/){ //TODO String newVar = "temp"+this.id; //this.addVar(newVar,new Type_intImp()); //TODO id++; return newVar; } public void next_layer(){ stackMap.plus(HashTreePMap.empty()); } public void quit_layer() throws Exception{ if(stackMap.isEmpty()){ throw new Exception(); } stackMap.minus(stackMap.indexOf(stackMap.getLast())); } public PMap peppapeek(){ return stackMap.getLast(); } public void addVar(String s, Type t){ //Save temporary if not PMap wont save PMap pmap = this.peppapeek(); pmap= pmap.plus(s/*+"_"+this.id*/,t); //this.id++; //Delete old ones stackMap.minus(stackMap.indexOf(stackMap.getLast())); //Push the new one stackMap.plus(pmap); } //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); } } 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(); } }