make sure we track Input.Region for epsilon reductions (important for ambiguity-hunting)
[sbp.git] / src / edu / berkeley / sbp / Sequence.java
index 5680d6c..84a2dc6 100644 (file)
@@ -84,10 +84,10 @@ public abstract class Sequence implements Iterable<Element>, SequenceOrElement {
 
     // DO NOT MESS WITH THE FOLLOWING LINE!!!
     private Forest.Many epsilonForm = null;
-    Forest epsilonForm() {
+    Forest epsilonForm(Input.Region loc) {
         if (epsilonForm!=null) return epsilonForm;
         epsilonForm = new Forest.Many();
-        epsilonForm.merge(firstp().rewrite(null, false));
+        epsilonForm.merge(firstp().rewrite(loc, false));
         return epsilonForm;
     }
 
@@ -100,10 +100,10 @@ public abstract class Sequence implements Iterable<Element>, SequenceOrElement {
     class Position implements IntegerMappable {
 
         private Forest zero = null;
-        public Forest zero() {
+        public Forest zero(Input.Region reg) {
             if (zero != null) return zero;
             if (pos > 0) throw new Error();
-            return zero = rewrite(null);
+            return zero = rewrite(reg);
         }
 
 
@@ -135,10 +135,10 @@ public abstract class Sequence implements Iterable<Element>, SequenceOrElement {
 
         final <T> Forest<T> rewrite(Input.Region loc) { return rewrite(loc, true); }
         private final <T> Forest<T> rewrite(Input.Region loc, boolean epsilonCheck) {
-            if (epsilonCheck && this==firstp()) return epsilonForm();
+            if (epsilonCheck && this==firstp()) return epsilonForm(loc);
             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();
+                if (holder[i]==null) holder[i] = elements[i].epsilonForm(loc);
                 if (holder[i]==null) throw new Error("bad " + i);
             }
             Forest<T> ret = Sequence.this.postReduce(loc, holder, this);