5 public class SymbolTable {
7 private Hashtable table;
8 private SymbolTable parent;
9 private HashSet valueset;
11 private Vector<SymbolTable> parentIFs;
13 public SymbolTable() {
14 table = new Hashtable();
15 valueset = new HashSet();
20 public SymbolTable(SymbolTable parent) {
21 table = new Hashtable();
25 public void add(Descriptor d) {
26 add(d.getSymbol(), d);
29 public void add(String name, Descriptor d) {
30 if (!table.containsKey(name))
31 table.put(name, new HashSet());
32 HashSet hs=(HashSet)table.get(name);
37 public Set getSet(String name) {
41 private HashSet getPSet(String name) {
42 HashSet hs=(parent!=null)?parent.getPSet(name):new HashSet();
44 if(this.parentIFs != null) {
45 for(int i = 0; i < parentIFs.size(); i++) {
46 hs.addAll(parentIFs.elementAt(i).getPSet(name));
49 if (table.containsKey(name)) {
50 hs.addAll((HashSet)table.get(name));
55 public Set getSetFromSameScope(String name) {
56 return getPSetFromSameScope(name);
59 private HashSet getPSetFromSameScope(String name) {
60 if (table.containsKey(name)) {
61 HashSet hs=(HashSet)table.get(name);
67 public Descriptor get(String name) {
68 Descriptor d = getFromSameScope(name);
78 if(parentIFs != null) {
79 for(int i = 0; i < parentIFs.size(); i++) {
80 d = parentIFs.elementAt(i).get(name);
90 public Descriptor getFromSameScope(String name) {
91 if (table.containsKey(name)) {
92 HashSet hs=(HashSet) table.get(name);
93 return (Descriptor) hs.iterator().next();
99 public Enumeration getNames() {
103 public Iterator getNamesIterator() {
104 return table.keySet().iterator();
107 public Set getValueSet() {
111 public Iterator getDescriptorsIterator() {
112 return getValueSet().iterator();
115 public Set getAllValueSet() {
118 hs=(HashSet) parent.getAllValueSet();
121 if (parentIFs != null) {
122 for(int i = 0; i < parentIFs.size(); i++) {
123 hs.addAll(parentIFs.elementAt(i).getAllValueSet());
131 public Iterator getAllDescriptorsIterator() {
132 return getAllValueSet().iterator();
135 public boolean contains(String name) {
136 return (get(name) != null);
139 public SymbolTable getParent() {
143 public void setParent(SymbolTable parent) {
144 this.parent = parent;
147 public Vector<SymbolTable> getParentIFs() {
151 public void addParentIF(SymbolTable parentif) {
152 if(parentIFs == null) {
153 parentIFs = new Vector<SymbolTable>();
155 parentIFs.addElement(parentif);
158 public String toString() {
159 return "ST: " + table.toString();