checkpoint
[sbp.git] / src / edu / berkeley / sbp / Sequence.java
index 3ac811e..6b615dc 100644 (file)
@@ -72,12 +72,10 @@ public abstract class Sequence extends Element implements Iterable<Element> {
 
     // DO NOT MESS WITH THE FOLLOWING LINE!!!
     private Forest.Ref epsilonForm = null;
 
     // DO NOT MESS WITH THE FOLLOWING LINE!!!
     private Forest.Ref epsilonForm = null;
-    private boolean eps = false;
     Forest epsilonForm() {
     Forest epsilonForm() {
-        if (epsilonForm==null) {
-            epsilonForm = new Forest.Ref();
-            epsilonForm.merge(firstp().rewrite2(null));
-        }
+        if (epsilonForm!=null) return epsilonForm;
+        epsilonForm = new Forest.Ref();
+        epsilonForm.merge(firstp().rewrite(null, false));
         return epsilonForm;
     }
 
         return epsilonForm;
     }
 
@@ -123,12 +121,9 @@ public abstract class Sequence extends Element implements Iterable<Element> {
 
         // Position /////////////////////////////////////////////////////////////////////////////////
 
 
         // Position /////////////////////////////////////////////////////////////////////////////////
 
-        final <T> Forest<T> rewrite(Input.Location loc) {
-            if (this==firstp()) return epsilonForm();
-            return rewrite2(loc);
-        }
-
-        final <T> Forest<T> rewrite2(Input.Location loc) {
+        final <T> Forest<T> rewrite(Input.Location loc) { return rewrite(loc, true); }
+        private final <T> Forest<T> rewrite(Input.Location loc, boolean epsilonCheck) {
+            if (epsilonCheck && this==firstp()) return epsilonForm();
             for(int i=0; i<pos; i++) if (holder[i]==null) throw new Error("realbad " + i);
             for(int i=pos; i<elements.length; i++) {
                 if (holder[i]==null) holder[i] = elements[i].epsilonForm();
             for(int i=0; i<pos; i++) if (holder[i]==null) throw new Error("realbad " + i);
             for(int i=pos; i<elements.length; i++) {
                 if (holder[i]==null) holder[i] = elements[i].epsilonForm();