5 public class SymbolTable {
7 private Hashtable table;
8 private SymbolTable parent;
9 private HashSet valueset;
11 private Vector<SymbolTable> parentIFs;
12 private SymbolTable surrounding;
15 public SymbolTable() {
16 table = new Hashtable();
17 valueset = new HashSet();
20 this.surrounding = null;
23 public SymbolTable(SymbolTable parent) {
24 table = new Hashtable();
28 public void add(Descriptor d) {
29 add(d.getSymbol(), d);
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);
40 public Set getSet(String name) {
44 private HashSet getPSet(String name) {
45 HashSet hs=(parent!=null)?parent.getPSet(name):new HashSet();
47 if(this.parentIFs != null) {
48 for(int i = 0; i < parentIFs.size(); i++) {
49 hs.addAll(parentIFs.elementAt(i).getPSet(name));
52 if(this.surrounding != null) {
53 hs.addAll(this.surrounding.getPSet(name));
55 if (table.containsKey(name)) {
56 hs.addAll((HashSet)table.get(name));
61 public Set getSetFromSameScope(String name) {
62 return getPSetFromSameScope(name);
65 private HashSet getPSetFromSameScope(String name) {
66 if (table.containsKey(name)) {
67 HashSet hs=(HashSet)table.get(name);
73 public Descriptor get(String name) {
74 Descriptor d = getFromSameScope(name);
84 if(parentIFs != null) {
85 for(int i = 0; i < parentIFs.size(); i++) {
86 d = parentIFs.elementAt(i).get(name);
93 if(this.surrounding != null) {
94 d = this.surrounding.get(name);
103 public Descriptor getFromSameScope(String name) {
104 if (table.containsKey(name)) {
105 HashSet hs=(HashSet) table.get(name);
106 return (Descriptor) hs.iterator().next();
112 public Enumeration getNames() {
116 public Iterator getNamesIterator() {
117 return table.keySet().iterator();
120 public Set getValueSet() {
124 public Iterator getDescriptorsIterator() {
125 return getValueSet().iterator();
128 public Set getAllValueSet() {
131 hs=(HashSet) parent.getAllValueSet();
134 if (parentIFs != null) {
135 for(int i = 0; i < parentIFs.size(); i++) {
136 hs.addAll(parentIFs.elementAt(i).getAllValueSet());
139 if(this.surrounding != null) {
140 hs.addAll(this.surrounding.getAllValueSet());
147 public Iterator getAllDescriptorsIterator() {
148 return getAllValueSet().iterator();
151 public boolean contains(String name) {
152 return (get(name) != null);
155 public SymbolTable getParent() {
159 public void setParent(SymbolTable parent) {
160 this.parent = parent;
163 public SymbolTable getSurrounding() {
164 return this.surrounding;
167 public void setSurrounding(SymbolTable surrounding) {
168 this.surrounding = surrounding;
171 public Vector<SymbolTable> getParentIFs() {
175 public void addParentIF(SymbolTable parentif) {
176 if(parentIFs == null) {
177 parentIFs = new Vector<SymbolTable>();
179 parentIFs.addElement(parentif);
182 public String toString() {
183 return "ST: " + table.toString();