5 public class SymbolTable {
7 private Hashtable table;
8 private SymbolTable parent;
9 private HashSet valueset;
11 private Vector<SymbolTable> parentIFs;
14 public SymbolTable() {
15 table = new Hashtable();
16 valueset = new HashSet();
21 public SymbolTable(SymbolTable parent) {
22 table = new Hashtable();
26 public void add(Descriptor d) {
27 add(d.getSymbol(), d);
30 public void add(String name, Descriptor d) {
31 if (!table.containsKey(name))
32 table.put(name, new HashSet());
33 HashSet hs=(HashSet)table.get(name);
38 public Set getSet(String name) {
42 private HashSet getPSet(String name) {
43 HashSet hs=(parent!=null)?parent.getPSet(name):new HashSet();
45 if(this.parentIFs != null) {
46 for(int i = 0; i < parentIFs.size(); i++) {
47 hs.addAll(parentIFs.elementAt(i).getPSet(name));
50 if (table.containsKey(name)) {
51 hs.addAll((HashSet)table.get(name));
56 public Set getSetFromSameScope(String name) {
57 return getPSetFromSameScope(name);
60 private HashSet getPSetFromSameScope(String name) {
61 if (table.containsKey(name)) {
62 HashSet hs=(HashSet)table.get(name);
68 public Descriptor get(String name) {
69 Descriptor d = getFromSameScope(name);
79 if(parentIFs != null) {
80 for(int i = 0; i < parentIFs.size(); i++) {
81 d = parentIFs.elementAt(i).get(name);
91 public Descriptor getFromSameScope(String name) {
92 if (table.containsKey(name)) {
93 HashSet hs=(HashSet) table.get(name);
94 return (Descriptor) hs.iterator().next();
100 public Enumeration getNames() {
104 public Iterator getNamesIterator() {
105 return table.keySet().iterator();
108 public Set getValueSet() {
112 public Iterator getDescriptorsIterator() {
113 return getValueSet().iterator();
116 public Set getAllValueSet() {
119 hs=(HashSet) parent.getAllValueSet();
122 if (parentIFs != null) {
123 for(int i = 0; i < parentIFs.size(); i++) {
124 hs.addAll(parentIFs.elementAt(i).getAllValueSet());
132 public Iterator getAllDescriptorsIterator() {
133 return getAllValueSet().iterator();
136 public boolean contains(String name) {
137 return (get(name) != null);
140 public SymbolTable getParent() {
144 public void setParent(SymbolTable parent) {
145 this.parent = parent;
148 public Vector<SymbolTable> getParentIFs() {
152 public void addParentIF(SymbolTable parentif) {
153 if(parentIFs == null) {
154 parentIFs = new Vector<SymbolTable>();
156 parentIFs.addElement(parentif);
159 public String toString() {
160 return "ST: " + table.toString();