1 package ro.infoiasi.donald.compiler.cfg; 2 3 import java.util.*; 4 5 public class NonTerminals { 6 private Map varByName = new HashMap(); 7 private List varByIndex = new ArrayList(); 8 9 public NonTerminal addNew(String name, String type) { 10 NonTerminal var = new NonTerminal(name, count(), type); 11 if (varByName.containsKey(name)) { 12 throw new RuntimeException ("Duplicate Non-Terminal ("+name+")"); 13 } 14 varByName.put(name, var); 15 varByIndex.add(var); 16 return var; 17 } 18 19 public NonTerminal addNew(String name) { 20 return addNew(name, null); 21 } 22 23 public int count() { 24 return varByIndex.size(); 25 } 26 27 public Iterator iterator() { 28 return Collections.unmodifiableList(varByIndex).iterator(); 29 } 30 31 public NonTerminal find(String name) { 32 return (NonTerminal)varByName.get(name); 33 } 34 35 public NonTerminal find(int index) { 36 if (index < 0 || index >= count()) { 37 return null; 38 } else { 39 return (NonTerminal)varByIndex.get(index); 40 } 41 } 42 43 public void clear() { 44 varByName.clear(); 45 varByIndex.clear(); 46 } 47 48 49 void removeUseless(List s) { 50 Iterator it = s.iterator(); 51 while (it.hasNext()) { 52 NonTerminal a = (NonTerminal)it.next(); 53 varByName.remove(a.getName()); 54 } 55 56 List tmp = new ArrayList(); 57 for (int i = 0; i<varByIndex.size(); i++) { 58 NonTerminal a = (NonTerminal)varByIndex.get(i); 59 if (!s.contains(a)) { 60 a.setIndex(tmp.size()); 61 tmp.add(a); 62 } 63 } 64 varByIndex = tmp; 65 } 66 67 public String toString() { 68 StringBuffer sb = new StringBuffer (); 69 Iterator it = iterator(); 70 while (it.hasNext()) { 71 sb.append(it.next()); 72 if (it.hasNext()) { 73 sb.append(", "); 74 } 75 } 76 return sb.toString(); 77 } 78 } 79 | Popular Tags |