+ 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();
+
+ abstract Sequence 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)
+ };
+ }
+ */
+ public int numPops() { return pos; }
+
+ final int pos;
+ private final Position next;
+ private final Position prev;
+ private transient Sequence owner;
+
+ public int provides() { return owner().sernum; }
+ public int[] needs() { return owner().needs_int(); }
+ public int[] hates() { return owner().hates_int(); }
+ public boolean owner_needed_or_hated() { return owner().needed_or_hated; }