3ada402962d337e5bcc5590360b9f56083643510
[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   private SymbolTable surrounding;
13
14
15   public SymbolTable() {
16     table = new Hashtable();
17     valueset = new HashSet();
18     parent = null;
19     parentIFs = null;
20     this.surrounding = null;
21   }
22
23   public SymbolTable(SymbolTable parent) {
24     table = new Hashtable();
25     this.parent = parent;
26   }
27
28   public void add(Descriptor d) {
29     add(d.getSymbol(), d);
30   }
31
32   public void add(String name, Descriptor d) {
33     if (!table.containsKey(name))
34       table.put(name, new HashSet());
35     HashSet hs=(HashSet)table.get(name);
36     hs.add(d);
37     valueset.add(d);
38   }
39
40   public Set getSet(String name) {
41     return getPSet(name);
42   }
43
44   private HashSet getPSet(String name) {
45     HashSet hs=(parent!=null)?parent.getPSet(name):new HashSet();
46
47     if(this.parentIFs != null) {
48       for(int i = 0; i < parentIFs.size(); i++) {
49         hs.addAll(parentIFs.elementAt(i).getPSet(name));
50       }
51     }
52     if(this.surrounding != null) {
53         hs.addAll(this.surrounding.getPSet(name));
54     }
55     if (table.containsKey(name)) {
56       hs.addAll((HashSet)table.get(name));
57     }
58     return hs;
59   }
60
61   public Set getSetFromSameScope(String name) {
62     return getPSetFromSameScope(name);
63   }
64
65   private HashSet getPSetFromSameScope(String name) {
66     if (table.containsKey(name)) {
67       HashSet hs=(HashSet)table.get(name);
68       return hs;
69     } else
70       return new HashSet();
71   }
72
73   public Descriptor get(String name) {
74     Descriptor d = getFromSameScope(name);
75     if (d != null)
76       return d;
77
78     if(parent != null) {
79       d = parent.get(name);
80       if (d!=null)
81         return d;
82     }
83     
84     if(parentIFs != null) {
85       for(int i = 0; i < parentIFs.size(); i++) {
86         d = parentIFs.elementAt(i).get(name);
87         if(d != null) {
88           return d;
89         }
90       }
91     }
92     
93     if(this.surrounding != null) {
94         d = this.surrounding.get(name);
95         if(d != null) {
96             return d;
97         }
98     }
99     
100     return null;
101   }
102
103   public Descriptor getFromSameScope(String name) {
104     if (table.containsKey(name)) {
105       HashSet hs=(HashSet) table.get(name);
106       return (Descriptor) hs.iterator().next();
107     } else
108       return null;
109
110   }
111
112   public Enumeration getNames() {
113     return table.keys();
114   }
115
116   public Iterator getNamesIterator() {
117     return table.keySet().iterator();
118   }
119
120   public Set getValueSet() {
121     return valueset;
122   }
123
124   public Iterator getDescriptorsIterator() {
125     return getValueSet().iterator();
126   }
127
128   public Set getAllValueSet() {
129     HashSet hs=null;
130     if (parent!=null)
131       hs=(HashSet) parent.getAllValueSet();
132     else
133       hs=new HashSet();
134     if (parentIFs != null) {
135       for(int i = 0; i < parentIFs.size(); i++) {
136         hs.addAll(parentIFs.elementAt(i).getAllValueSet());
137       }
138     }
139     if(this.surrounding != null) {
140         hs.addAll(this.surrounding.getAllValueSet());
141     }
142
143     hs.addAll(valueset);
144     return hs;
145   }
146
147   public Iterator getAllDescriptorsIterator() {
148     return getAllValueSet().iterator();
149   }
150
151   public boolean contains(String name) {
152     return (get(name) != null);
153   }
154
155   public SymbolTable getParent() {
156     return parent;
157   }
158
159   public void setParent(SymbolTable parent) {
160     this.parent = parent;
161   }
162   
163   public SymbolTable getSurrounding() {
164       return this.surrounding;
165   }
166   
167   public void setSurrounding(SymbolTable surrounding) {
168       this.surrounding = surrounding;
169   }
170
171   public Vector<SymbolTable> getParentIFs() {
172     return parentIFs;
173   }
174
175   public void addParentIF(SymbolTable parentif) {
176     if(parentIFs == null) {
177       parentIFs = new Vector<SymbolTable>();
178     }
179     parentIFs.addElement(parentif);
180   }
181
182   public String toString() {
183     return "ST: " + table.toString();
184   }
185 }