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 //////////////////////////////////////////////////////////////////////////////
}
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));
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));