implemented PCLOC annotation.
[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     parent = null;
17     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=(parent!=null)?parent.getPSet(name):new HashSet();
43
44     if(this.parentIFs != null) {
45       for(int i = 0; i < parentIFs.size(); i++) {
46         hs.addAll(parentIFs.elementAt(i).getPSet(name));
47       }
48     }
49     if (table.containsKey(name)) {
50       hs.addAll((HashSet)table.get(name));
51     }
52     return hs;
53   }
54
55   public Set getSetFromSameScope(String name) {
56     return getPSetFromSameScope(name);
57   }
58
59   private HashSet getPSetFromSameScope(String name) {
60     if (table.containsKey(name)) {
61       HashSet hs=(HashSet)table.get(name);
62       return hs;
63     } else
64       return new HashSet();
65   }
66
67   public Descriptor get(String name) {
68     Descriptor d = getFromSameScope(name);
69     if (d != null)
70       return d;
71
72     if(parent != null) {
73       d = parent.get(name);
74       if (d!=null)
75         return d;
76     }
77     
78     if(parentIFs != null) {
79       for(int i = 0; i < parentIFs.size(); i++) {
80         d = parentIFs.elementAt(i).get(name);
81         if(d != null) {
82           return d;
83         }
84       }
85     }
86     
87     return null;
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 (parentIFs != null) {
122       for(int i = 0; i < parentIFs.size(); i++) {
123         hs.addAll(parentIFs.elementAt(i).getAllValueSet());
124       }
125     }
126
127     hs.addAll(valueset);
128     return hs;
129   }
130
131   public Iterator getAllDescriptorsIterator() {
132     return getAllValueSet().iterator();
133   }
134
135   public boolean contains(String name) {
136     return (get(name) != null);
137   }
138
139   public SymbolTable getParent() {
140     return parent;
141   }
142
143   public void setParent(SymbolTable parent) {
144     this.parent = parent;
145   }
146   
147   public Vector<SymbolTable> getParentIFs() {
148     return parentIFs;
149   }
150
151   public void addParentIF(SymbolTable parentif) {
152     if(parentIFs == null) {
153       parentIFs = new Vector<SymbolTable>();
154     }
155     parentIFs.addElement(parentif);
156   }
157
158   public String toString() {
159     return "ST: " + table.toString();
160   }
161 }