checkpoint
[sbp.git] / src / edu / berkeley / sbp / Sequence.java
index 1b336ff..31d8f29 100644 (file)
@@ -50,14 +50,8 @@ public abstract class Sequence extends Element implements Iterable<Element> {
 
     ////////////////////////////////////////////////////////////////////////////////
 
-    public Element follow = null;
-    public final Topology follow() { return follow==null ? null : Atom.toAtom(follow); }
-
-    Topology toAtom() {
-        if (elements.length!=1)
-            throw new RuntimeException("cannot invoke toAtom() on a Sequence with " + elements.length + " elements: " + this);
-        return Atom.toAtom(elements[0]);
-    }
+    public Atom follow = null;
+    public final Topology follow() { return follow; }
 
     public Sequence and(Sequence s) { Sequence ret = dup(); ret.needs.add(s); s.needed.add(ret); return ret; }
     public Sequence not(Sequence s) { Sequence ret = dup(); ret.hates.add(s); s.hated.add(ret); return ret; }
@@ -80,10 +74,10 @@ public abstract class Sequence extends Element implements Iterable<Element> {
     }
 
     // DO NOT MESS WITH THE FOLLOWING LINE!!!
-    private Forest.Ref epsilonForm = null;
+    private Forest.Many epsilonForm = null;
     Forest epsilonForm() {
         if (epsilonForm!=null) return epsilonForm;
-        epsilonForm = new Forest.Ref();
+        epsilonForm = new Forest.Many();
         epsilonForm.merge(firstp().rewrite(null, false));
         return epsilonForm;
     }
@@ -184,7 +178,7 @@ public abstract class Sequence extends Element implements Iterable<Element> {
         public Constant(Element[] e, Object result) { super(e); this.result = result; }
         Sequence _clone() { return new Constant(elements, result); }
         public <T> Forest<T> postReduce(Input.Region loc, Forest<T>[] args, Position p) {
-            return (Forest<T>)Forest.leaf(loc, result, p);
+            return (Forest<T>)Forest.create(loc, result, null, false);
         }
         static class Drop extends Constant {
             Sequence _clone() { return new Drop(elements, lame); }
@@ -202,7 +196,7 @@ public abstract class Sequence extends Element implements Iterable<Element> {
         private final int idx;
         public Singleton(Element e) { this(new Element[] { e }, 0); }
         public Singleton(Element[] e, int idx) { super(e); this.idx = idx; }
-        public <T> Forest<T> postReduce(Input.Region loc, Forest<T>[] args, Position p) { return (Forest<T>)Forest.singleton(loc, args[idx], p); }
+        public <T> Forest<T> postReduce(Input.Region loc, Forest<T>[] args, Position p) { return args[idx]; }
         Sequence _clone() { return new Singleton(elements,idx); }
     }
 
@@ -215,13 +209,13 @@ public abstract class Sequence extends Element implements Iterable<Element> {
         Sequence _clone() { return new Unwrap(elements, drops); }
         public <T> Forest<T> postReduce(Input.Region loc, Forest<T>[] args, Position p) {
             for(int i=0; i<args.length; i++) if (args[i]==null) throw new Error();
-            if (drops==null) return Forest.create(loc, (T)tag, args, true, p);
+            if (drops==null) return Forest.create(loc, (T)tag, args, true);
             int count = 0;
             for(int i=0; i<drops.length; i++) if (!drops[i]) count++;
             Forest<T>[] args2 = new Forest[count];
             int j = 0;
             for(int i=0; i<args.length; i++) if (!drops[i]) args2[j++] = args[i];
-            return Forest.create(loc, (T)tag, args2, true, p);
+            return Forest.create(loc, (T)tag, args2, true);
         }
     }
 
@@ -258,7 +252,7 @@ public abstract class Sequence extends Element implements Iterable<Element> {
             int j = 0;
             for(int i=0; i<args.length; i++) if (!drops[i]) args2[j++] = args[i];
             //System.out.println("reduce \""+tag+"\"");
-            return Forest.create(loc, (T)tag, args2, false, p);
+            return Forest.create(loc, (T)tag, args2, false);
         }
         public StringBuffer toString(StringBuffer sb, boolean spacing) {
             int len = sb.length();