X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FCache.java;h=c60045438a35ec9c52bc585959d5031c801d8ea9;hp=454f584d4f3c32b1c8def991f064a6537f1dd1d2;hb=dc9bb3a45ed306e2e35549076842b3e74efecb48;hpb=449c39e0dafd7c736bfcd8d56bbd08b7a99e25a4 diff --git a/src/edu/berkeley/sbp/Cache.java b/src/edu/berkeley/sbp/Cache.java index 454f584..c600454 100644 --- a/src/edu/berkeley/sbp/Cache.java +++ b/src/edu/berkeley/sbp/Cache.java @@ -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 { + protected Union rootUnion; public HashMap follow = new HashMap(); public HashSet followEof = new HashSet(); public final HashMap possiblyEpsilon = new HashMap(); public HashSet all = new HashSet(); - public Cache(Union root, Topology top) { - this.root = root; - this.top = top; + abstract Topology 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())); return ret; } public Topology epsilonFollowSet(Sequence seq, HashSet 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 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));