checkpoint
[sbp.git] / src / edu / berkeley / sbp / Sequence.java
index 0ac3500..33a91bb 100644 (file)
@@ -45,6 +45,9 @@ public abstract class Sequence extends Element implements Iterable<Element> {
     public static Sequence rewritingSequence(Object tag, Element[] e, boolean[] drops) {
         return new RewritingSequence(tag, e, drops); }
 
+    public static Sequence regionRewritingSequence(Functor<Input.Region,Object> tagfunctor, Element[] e, boolean[] drops) {
+        return new RegionRewritingSequence(tagfunctor, e, drops); }
+
     ////////////////////////////////////////////////////////////////////////////////
 
     public Element follow = null;
@@ -222,8 +225,24 @@ public abstract class Sequence extends Element implements Iterable<Element> {
         }
     }
 
+
+
+    static class RegionRewritingSequence extends RewritingSequence {
+        private Functor<Input.Region, Object> tagf;
+        public RegionRewritingSequence(Functor<Input.Region,Object> tagfunctor, Element[] e, boolean[] drops) {
+            super(null, e, drops);
+            this.tagf = tagfunctor;
+        }
+        public <T> Forest<T> postReduce(Input.Region loc, Forest<T>[] args, Position p) {
+            this.tag = tagf.invoke(loc);
+            Forest<T> ret = super.postReduce(loc, args, p);
+            this.tag = null;
+            return ret;
+        }
+    }
+
     static class RewritingSequence extends Sequence {
-        /*private*/public final Object tag;
+        /*private*/public /*final*/ Object tag;
         private final boolean[] drops;
         private int count = 0;
         Sequence _clone() { return new RewritingSequence(tag, elements, drops); }