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