package com.drawbridge.jsengine;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Set;
import com.drawbridge.jsengine.jsobjects.JSType;
import com.drawbridge.jsengine.jsobjects.JSUndefined;
public class SymbolTable
{
private HashMap<String, SymbolTableEntry> mTable;
public SymbolTable(){
mTable = new HashMap<String, SymbolTableEntry>();
}
public void add(String name, SymbolTableEntry entry) throws SymbolTableException{
mTable.put(name, entry);
}
public void update(String name, JSType newValue) throws SymbolTableException{
if(mTable.containsKey(name)){
mTable.get(name).setVariable(newValue);
}
else{
throw new SymbolTableException("Exception: " + name + "--No such symbol!");
}
}
public SymbolTableEntry get(String name) throws SymbolTableException{
if(mTable.containsKey(name)){
return mTable.get(name);
}
else{
throw new SymbolTableException("Exception: " + name + "--No such symbol!");
}
}
public boolean contains(String name){
if(mTable.containsKey(name))
return true;
else
return false;
}
public void printSymbolTable(int increment){
String incrementString = "";
for(int i = 0; i < increment; i++)
incrementString += " ";
System.out.format(incrementString + "%10s\n", "Variables:");
System.out.format(incrementString + "%20s%20s%20s\n", "Name:", "Object:", "value");
Set<String> set = mTable.keySet();
Iterator<String> it = set.iterator();
while(it.hasNext()){
String name = it.next().toString();
SymbolTableEntry entry = mTable.get(name);
JSType variable = entry.getVariable();
if(variable == null) variable = new JSUndefined();
System.out.format(incrementString + "%20s%20s%20s\n", name, variable.getClass().getSimpleName(), variable.toString());
}
}
public LinkedList<JSType> getObjectOfType(JSType type){
LinkedList<JSType> results = new LinkedList<JSType>();
Set<String> set = mTable.keySet();
Iterator<String> it = set.iterator();
while(it.hasNext()){
String name = it.next().toString();
SymbolTableEntry entry = mTable.get(name);
if(entry.getVariable().getClass().getName().equals(type.getClass().getName())){
results.add((JSType) entry.getVariable());
}
}
return results;
}
public class SymbolTableException extends Exception{
private static final long serialVersionUID = -6787406324868368906L;
public SymbolTableException() { super(); }
public SymbolTableException(String message) { super(message); }
public SymbolTableException(String message, Throwable cause) { super(message, cause); }
public SymbolTableException(Throwable cause) { super(cause); }
}
}