checkpoint
[sbp.git] / src / edu / berkeley / sbp / Walk.java
index cfd9c31..0d4233a 100644 (file)
@@ -52,7 +52,7 @@ abstract class Walk<T> {
         public HashSet<Element> bottom(Element e)     { return acc; }
         public HashSet<Element> sequence(Sequence seq) { return bottom(seq); }
         public HashSet<Element> walkAtom(Atom r) {
         public HashSet<Element> bottom(Element e)     { return acc; }
         public HashSet<Element> sequence(Sequence seq) { return bottom(seq); }
         public HashSet<Element> walkAtom(Atom r) {
-            c.atoms.put(e, c.atoms.get(e)==null ? r.dup() : c.atoms.get(e).union(r.dup()));
+            c.atoms.put(e, c.atoms.get(e)==null ? r : c.atoms.get(e).union(r));
             return super.walkAtom(r);
         }
     }
             return super.walkAtom(r);
         }
     }
@@ -83,7 +83,7 @@ abstract class Walk<T> {
         public WalkTokenSet(Topology<Tok> cs)          { this.cs = cs; }
         public WalkTokenSet(Topology<Tok> cs, Cache c) { super(c); this.cs = cs; }
         public Topology<Tok> bottom(Element e)         { return cs; }
         public WalkTokenSet(Topology<Tok> cs)          { this.cs = cs; }
         public WalkTokenSet(Topology<Tok> cs, Cache c) { super(c); this.cs = cs; }
         public Topology<Tok> bottom(Element e)         { return cs; }
-        public Topology<Tok> walkAtom(Atom r)          { cs.add(r.dup()); return cs; }
+        public Topology<Tok> walkAtom(Atom r)          { cs = cs.union(r); return cs; }
     }
 
     class First<Tok extends Token> extends WalkTokenSet<Tok> {
     }
 
     class First<Tok extends Token> extends WalkTokenSet<Tok> {
@@ -97,20 +97,6 @@ abstract class Walk<T> {
         }
     }
 
         }
     }
 
-    class Last<Tok extends Token> extends WalkTokenSet<Tok> {
-        public Last(Topology<Tok> cs, Walk.Cache cache) { super(cs, cache); }
-        public Topology<Tok> sequence(Sequence seq) { sequence(seq.firstp()); return cs; }
-        private Topology<Tok> sequence(Position p) {
-            if (p==null) return null;
-            Topology<Tok> ret = sequence(p.next());
-            if (ret!=null) return ret;
-            if (p.isLast()) return null;
-            if (p.element().possiblyEpsilon(c)) return null;
-            if (p.element()==null) return null;
-            return walk(p.element());
-        }
-    }
-
     static class Follow<Tok extends Token> extends WalkTokenSet<Tok> {
         private final Element me;
         private final HashSet<Element> all;
     static class Follow<Tok extends Token> extends WalkTokenSet<Tok> {
         private final Element me;
         private final HashSet<Element> all;
@@ -127,7 +113,7 @@ abstract class Walk<T> {
             if (c != null) {
                 Topology<Tok> cached = (Topology<Tok>)c.follow.get(e);
                 if (cached != null) {
             if (c != null) {
                 Topology<Tok> cached = (Topology<Tok>)c.follow.get(e);
                 if (cached != null) {
-                    cs.add(cached);
+                    cs = cs.union(cached);
                     eof |= c.eof.get(e);
                     return cs;
                 }
                     eof |= c.eof.get(e);
                     return cs;
                 }
@@ -135,24 +121,22 @@ abstract class Walk<T> {
 
             Topology<Tok> cso = cs;
             boolean eofo = eof;
 
             Topology<Tok> cso = cs;
             boolean eofo = eof;
-            eof = false;
-            cs = cso.fresh();
+            eof = c.eof.get(e) != null && c.eof.get(e).booleanValue();
+            cs = cso.empty();
 
 
-            if (e instanceof Parser.Table.Top) eof = true;
             for(Element x : all) {
                 boolean matched = false;
             for(Element x : all) {
                 boolean matched = false;
-                if (x instanceof Parser.Table.Top) walk(x); // because this symbol might not appear in any other Sequence
                 if (!(x instanceof Sequence)) continue;
                 Sequence a = (Sequence)x;
                 Position mp = null;
                 for(Position pos = a.firstp(); pos != null && !pos.isLast(); pos = pos.next()) {
                 if (!(x instanceof Sequence)) continue;
                 Sequence a = (Sequence)x;
                 Position mp = null;
                 for(Position pos = a.firstp(); pos != null && !pos.isLast(); pos = pos.next()) {
-                    if (matched) cs.add(new First<Tok>(cs.fresh(), c).walk(pos.element()));
+                    if (matched) cs = cs.union(new First<Tok>(cs.empty(), c).walk(pos.element()));
                     if (pos.isLast()) { matched = (matched && pos.element().possiblyEpsilon(c)); continue; }
                     boolean good = false;
                     if (e instanceof Atom) {
                         Topology top = c.atoms.get(pos.element());
                         if (top==null) continue;
                     if (pos.isLast()) { matched = (matched && pos.element().possiblyEpsilon(c)); continue; }
                     boolean good = false;
                     if (e instanceof Atom) {
                         Topology top = c.atoms.get(pos.element());
                         if (top==null) continue;
-                        if (!(top.containsAll(((Atom)e).dup()))) continue;
+                        if (!(top.containsAll(((Atom)e)))) continue;
                     } else {
                         if (c.ys.get(pos.element()).contains(e)) good = true;
                     }
                     } else {
                         if (c.ys.get(pos.element()).contains(e)) good = true;
                     }
@@ -164,20 +148,17 @@ abstract class Walk<T> {
                 if (matched) walk(a);
             }
 
                 if (matched) walk(a);
             }
 
-            if (e instanceof Repeat.MaximalSequence || e instanceof Repeat.Maximal)
-                cs.remove(new Last<Tok>(cs.fresh(), c).walk(e));
-            /*
             if (e instanceof Sequence) {
                 Sequence s = (Sequence)e;
             if (e instanceof Sequence) {
                 Sequence s = (Sequence)e;
-                if (s.noFollow() != null) cs.remove(s.noFollow());
+                if (s.noFollow() != null) cs = cs.minus(s.noFollow());
             }
             }
-            */
+
             if (c != null && e==me) {
             if (c != null && e==me) {
-                c.follow.put(e, cs.dup());
+                c.follow.put(e, cs);
                 c.eof.put(e, eof);
             }
 
                 c.eof.put(e, eof);
             }
 
-            cso.add(cs);
+            cso = cso.union(cs);
             cs = cso;
             eofo |= eof;
             eof = eofo;
             cs = cso;
             eofo |= eof;
             eof = eofo;