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); } } }