132 lines
3.6 KiB
Java
132 lines
3.6 KiB
Java
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<PMap<String,ValueTable>> stackMap;
|
|
private int id=1;
|
|
public int idLabel = 1;
|
|
public SymTable(){
|
|
this.stackMap= ConsPStack.empty();
|
|
}
|
|
public SymTable(PStack<PMap<String,ValueTable>> 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<PMap<String,ValueTable>> next_layer(){
|
|
return stackMap.plus(HashTreePMap.empty());
|
|
}
|
|
|
|
public PMap<String,ValueTable> peppapeek(){
|
|
if(stackMap.isEmpty()){
|
|
return this.next_layer().getLast();
|
|
}
|
|
return stackMap.getLast();
|
|
}
|
|
|
|
public SymTable addVar(String s, Type t){
|
|
PStack<PMap<String,ValueTable>> newpstack = null;
|
|
if(this.stackMap.isEmpty()){
|
|
newpstack = this.next_layer();
|
|
}
|
|
else newpstack = this.stackMap;
|
|
|
|
//Save temporary if not PMap wont save
|
|
PMap<String, ValueTable> 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<PMap<String,ValueTable>> 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();
|
|
}
|
|
}
|