5 public class SymbolTable {
7 private Hashtable table;
8 private SymbolTable parent;
9 private HashSet valueset;
11 private Vector<SymbolTable> parentIFs;
13 public SymbolTable() {
14 table = new Hashtable();
15 valueset = new HashSet();
17 this.parentIFs = null;
20 public SymbolTable(SymbolTable parent) {
21 table = new Hashtable();
25 public void add(Descriptor d) {
26 add(d.getSymbol(), d);
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);
37 public Set getSet(String name) {
41 private HashSet getPSet(String name) {
44 hs=parent.getPSet(name);
47 if(this.parentIFs != null) {
48 for(int i = 0; i < parentIFs.size(); i++) {
49 hs.addAll(parentIFs.elementAt(i).getPSet(name));
52 if (table.containsKey(name)) {
53 hs.addAll((HashSet)table.get(name));
58 public Set getSetFromSameScope(String name) {
59 return getPSetFromSameScope(name);
62 private HashSet getPSetFromSameScope(String name) {
63 if (table.containsKey(name)) {
64 HashSet hs=(HashSet)table.get(name);
70 public Descriptor get(String name) {
71 Descriptor d = getFromSameScope(name);
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);
88 public Descriptor getFromSameScope(String name) {
89 if (table.containsKey(name)) {
90 HashSet hs=(HashSet) table.get(name);
91 return (Descriptor) hs.iterator().next();
97 public Enumeration getNames() {
101 public Iterator getNamesIterator() {
102 return table.keySet().iterator();
105 public Set getValueSet() {
109 public Iterator getDescriptorsIterator() {
110 return getValueSet().iterator();
113 public Set getAllValueSet() {
116 hs=(HashSet) parent.getAllValueSet();
119 if (this.parentIFs != null) {
120 for(int i = 0; i < this.parentIFs.size(); i++) {
121 hs.addAll(this.parentIFs.elementAt(i).getAllValueSet());
128 public Iterator getAllDescriptorsIterator() {
129 return getAllValueSet().iterator();
132 public boolean contains(String name) {
133 return (get(name) != null);
136 public SymbolTable getParent() {
140 public void setParent(SymbolTable parent) {
141 this.parent = parent;
144 public Vector<SymbolTable> getParentIFs() {
145 return this.parentIFs;
148 public void addParentIF(SymbolTable parentif) {
149 if(this.parentIFs == null) {
150 this.parentIFs = new Vector<SymbolTable>();
152 this.parentIFs.addElement(parentif);
156 public String toString() {
157 return "ST: " + table.toString();