cleanups, reorg, and commenting
[sbp.git] / src / edu / berkeley / sbp / Cache.java
index 454f584..c600454 100644 (file)
@@ -9,18 +9,20 @@ import java.util.*;
 import java.lang.reflect.*;
 import java.lang.ref.*;
 
-class Cache {
-    private Union root;
-    private Topology top;
+abstract class Cache<Token> {
+    protected Union rootUnion;
 
     public HashMap<Sequence, Topology> follow = new HashMap<Sequence, Topology>();
     public HashSet<Sequence> followEof = new HashSet<Sequence>();
     public final HashMap<SequenceOrElement,Boolean> possiblyEpsilon = new HashMap<SequenceOrElement,Boolean>();
     public HashSet<SequenceOrElement> all = new HashSet<SequenceOrElement>();
 
-    public Cache(Union root, Topology top) {
-        this.root = root;
-        this.top = top;
+    abstract Topology<Token> emptyTopology();
+    public Cache(Union root) {
+        this.rootUnion = root;
+        if (root != null)
+            for(Sequence s : root)
+                buildFollowSet(s, emptyTopology(), true);
     }
 
     // Follow //////////////////////////////////////////////////////////////////////////////
@@ -55,18 +57,18 @@ class Cache {
     }
 
     public Topology epsilonFollowSet(Union u) {
-        Topology ret = top.empty();
+        Topology ret = emptyTopology();
         for(Sequence s : u)
             ret = ret.union(epsilonFollowSet(s, new HashSet<Sequence>()));
         return ret;
     }
     public Topology epsilonFollowSet(Sequence seq, HashSet<Sequence> seen) {
-        Topology ret = seq.follow==null ? top.empty().complement() : seq.follow.getTokenTopology();
+        Topology ret = seq.follow==null ? emptyTopology().complement() : seq.follow.getTokenTopology();
         if (seen.contains(seq)) return ret;
         seen.add(seq);
         for(Position p = seq.firstp(); p!=null && !p.isLast(); p = p.next()) {
             if (!(p.element() instanceof Union)) continue;
-            Topology t = top.empty();
+            Topology t = emptyTopology();
             for(Sequence s : ((Union)p.element()))
                 if (possiblyEpsilon(s))
                     t = t.union(epsilonFollowSet(s, seen));
@@ -77,12 +79,12 @@ class Cache {
 
     public Topology first(SequenceOrElement e, HashSet<Sequence> seen) {
         if (e instanceof Atom) return ((Atom)e).getTokenTopology();
-        Topology ret = top.empty();
+        Topology ret = emptyTopology();
         if (e instanceof Union) {
             for(Sequence s : ((Union)e)) ret = ret.union(first(s, seen));
         } else {
             Sequence seq = (Sequence)e;
-            if (seen.contains(seq)) return top.empty();
+            if (seen.contains(seq)) return emptyTopology();
             seen.add(seq);
             for(Position p = seq.firstp(); p!=null && !p.isLast(); p = p.next()) {
                 ret = ret.union(first(p.element(), seen));