push a bunch of old changes i had related to inner classes and such... hope this...
[IRC.git] / Robust / src / IR / SymbolTable.java
1 package IR;
2
3 import java.util.*;
4
5 public class SymbolTable {
6
7   private Hashtable table;
8   private SymbolTable parent;
9   private HashSet valueset;
10
11   private Vector<SymbolTable> parentIFs;
12
13
14   public SymbolTable() {
15     table = new Hashtable();
16     valueset = new HashSet();
17     parent = null;
18     parentIFs = null;
19   }
20
21   public SymbolTable(SymbolTable parent) {
22     table = new Hashtable();
23     this.parent = parent;
24   }
25
26   public void add(Descriptor d) {
27     add(d.getSymbol(), d);
28   }
29
30   public void add(String name, Descriptor d) {
31     if (!table.containsKey(name))
32       table.put(name, new HashSet());
33     HashSet hs=(HashSet)table.get(name);
34     hs.add(d);
35     valueset.add(d);
36   }
37
38   public Set getSet(String name) {
39     return getPSet(name);
40   }
41
42   private HashSet getPSet(String name) {
43     HashSet hs=(parent!=null)?parent.getPSet(name):new HashSet();
44
45     if(this.parentIFs != null) {
46       for(int i = 0; i < parentIFs.size(); i++) {
47         hs.addAll(parentIFs.elementAt(i).getPSet(name));
48       }
49     }
50     if (table.containsKey(name)) {
51       hs.addAll((HashSet)table.get(name));
52     }
53     return hs;
54   }
55
56   public Set getSetFromSameScope(String name) {
57     return getPSetFromSameScope(name);
58   }
59
60   private HashSet getPSetFromSameScope(String name) {
61     if (table.containsKey(name)) {
62       HashSet hs=(HashSet)table.get(name);
63       return hs;
64     } else
65       return new HashSet();
66   }
67
68   public Descriptor get(String name) {
69     Descriptor d = getFromSameScope(name);
70     if (d != null)
71       return d;
72
73     if(parent != null) {
74       d = parent.get(name);
75       if (d!=null)
76         return d;
77     }
78     
79     if(parentIFs != null) {
80       for(int i = 0; i < parentIFs.size(); i++) {
81         d = parentIFs.elementAt(i).get(name);
82         if(d != null) {
83           return d;
84         }
85       }
86     }
87     
88     return null;
89   }
90
91   public Descriptor getFromSameScope(String name) {
92     if (table.containsKey(name)) {
93       HashSet hs=(HashSet) table.get(name);
94       return (Descriptor) hs.iterator().next();
95     } else
96       return null;
97
98   }
99
100   public Enumeration getNames() {
101     return table.keys();
102   }
103
104   public Iterator getNamesIterator() {
105     return table.keySet().iterator();
106   }
107
108   public Set getValueSet() {
109     return valueset;
110   }
111
112   public Iterator getDescriptorsIterator() {
113     return getValueSet().iterator();
114   }
115
116   public Set getAllValueSet() {
117     HashSet hs=null;
118     if (parent!=null)
119       hs=(HashSet) parent.getAllValueSet();
120     else
121       hs=new HashSet();
122     if (parentIFs != null) {
123       for(int i = 0; i < parentIFs.size(); i++) {
124         hs.addAll(parentIFs.elementAt(i).getAllValueSet());
125       }
126     }
127
128     hs.addAll(valueset);
129     return hs;
130   }
131
132   public Iterator getAllDescriptorsIterator() {
133     return getAllValueSet().iterator();
134   }
135
136   public boolean contains(String name) {
137     return (get(name) != null);
138   }
139
140   public SymbolTable getParent() {
141     return parent;
142   }
143
144   public void setParent(SymbolTable parent) {
145     this.parent = parent;
146   }
147
148   public Vector<SymbolTable> getParentIFs() {
149     return parentIFs;
150   }
151
152   public void addParentIF(SymbolTable parentif) {
153     if(parentIFs == null) {
154       parentIFs = new Vector<SymbolTable>();
155     }
156     parentIFs.addElement(parentif);
157   }
158
159   public String toString() {
160     return "ST: " + table.toString();
161   }
162 }