get rid of the stream parsing that occurs in the Layer III decoder. BitStream.readFra...
[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 < parentIFs.size(); i++) {
49         hs.addAll(parentIFs.elementAt(i).getPSet(name));
50       }
51     }
52     if (table.containsKey(name)) {
53       hs.addAll((HashSet)table.get(name));
54     }
55     return hs;
56   }
57
58   public Set getSetFromSameScope(String name) {
59     return getPSetFromSameScope(name);
60   }
61
62   private HashSet getPSetFromSameScope(String name) {
63     if (table.containsKey(name)) {
64       HashSet hs=(HashSet)table.get(name);
65       return hs;
66     } else
67       return new HashSet();
68   }
69
70   public Descriptor get(String name) {
71     Descriptor d = getFromSameScope(name);
72     if (d == null) {
73       if(parent != null) {
74         d = parent.get(name);
75       }
76       if((d == null) && (this.parentIFs != null)) {
77         for(int i = 0; i < this.parentIFs.size(); i++) {
78           d = this.parentIFs.elementAt(i).get(name);
79           if(d != null) {
80             return d;
81           }
82         }
83       }
84     }
85     return d;
86   }
87
88   public Descriptor getFromSameScope(String name) {
89     if (table.containsKey(name)) {
90       HashSet hs=(HashSet) table.get(name);
91       return (Descriptor) hs.iterator().next();
92     } else
93       return null;
94
95   }
96
97   public Enumeration getNames() {
98     return table.keys();
99   }
100
101   public Iterator getNamesIterator() {
102     return table.keySet().iterator();
103   }
104
105   public Set getValueSet() {
106     return valueset;
107   }
108
109   public Iterator getDescriptorsIterator() {
110     return getValueSet().iterator();
111   }
112
113   public Set getAllValueSet() {
114     HashSet hs=null;
115     if (parent!=null)
116       hs=(HashSet) parent.getAllValueSet();
117     else
118       hs=new HashSet();
119     if (this.parentIFs != null) {
120       for(int i = 0; i < this.parentIFs.size(); i++) {
121         hs.addAll(this.parentIFs.elementAt(i).getAllValueSet());
122       }
123     }
124     hs.addAll(valueset);
125     return hs;
126   }
127
128   public Iterator getAllDescriptorsIterator() {
129     return getAllValueSet().iterator();
130   }
131
132   public boolean contains(String name) {
133     return (get(name) != null);
134   }
135
136   public SymbolTable getParent() {
137     return parent;
138   }
139
140   public void setParent(SymbolTable parent) {
141     this.parent = parent;
142   }
143
144   public Vector<SymbolTable> getParentIFs() {
145     return this.parentIFs;
146   }
147
148   public void addParentIF(SymbolTable parentif) {
149     if(this.parentIFs == null) {
150       this.parentIFs = new Vector<SymbolTable>();
151     }
152     this.parentIFs.addElement(parentif);
153   }
154
155
156   public String toString() {
157     return "ST: " + table.toString();
158   }
159 }