-
- // Reduction /////////////////////////////////////////////////////////////////////////////////
-
- <T> Forest<T> rewrite(Token.Location loc) {
- for(int i=pos; i<elements.length; i++) if (holder[i]==null) holder[i] = elements[i].epsilonForm();
- Forest<T> ret = Sequence.this.postReduce(loc, holder);
- for(int k=0; k<pos; k++) holder[k] = null; // to help GC
- return ret;
+ public Position last() { return isLast() ? this : next().last(); }
+ public Position prev() { return prev; }
+
+ // Position /////////////////////////////////////////////////////////////////////////////////
+
+ 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(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(loc);
+ if (holder[i]==null) throw new Error("bad " + i);
+ }
+ return Sequence.this.postReduce(loc, holder, this);