- private Forest zero = null;
- public Forest zero(Input.Region reg) {
- if (zero != null) return zero;
- if (pos > 0) throw new Error();
- return zero = rewrite(reg);
+ public abstract int provides();
+ public abstract int[] needs();
+ public abstract int[] hates();
+ public abstract boolean owner_needed_or_hated();
+
+ public abstract boolean isFirst();
+ public abstract boolean isLast();
+ public abstract Pos last();
+ public abstract Pos prev();
+ public abstract Pos next();
+
+ /** the element which produces the sequence to which this Position belongs */
+ public Sequence owner() { return owner; }
+
+ abstract Element element();
+
+ public abstract int numPops();
+ public abstract <T> Forest<T> rewrite(Input.Region loc);
+ }
+
+ /** the imaginary position before or after an element of a sequence; corresponds to an "LR item" */
+ private static class Position extends Pos implements IntegerMappable {
+ /*
+ public Pos getPos() {
+ return new DumbPos(elements.length, provides(), needs(), hates(), owner_needed_or_hated(), numPops(),
+ public int provides();
+ public int[] needs();
+ public int[] hates();
+ public boolean owner_needed_or_hated();
+ public int numPops();
+ public <T> Forest<T> rewrite(Input.Region loc)
+ };