}
public String toString() { return "[reduce " + position + "]"; }
+ private Forest zero = null;
+ public Forest zero() {
+ if (zero != null) return zero;
+ if (numPop > 0) throw new Error();
+ return zero = position.rewrite(null);
+ }
+
public Forest reduce(GSS.Phase.Node parent) {
if (numPop==0) return finish(parent, zero(), parent.phase());
return reduce(parent, numPop-1, null, parent.phase());
if (numPop<=0) throw new Error("called wrong form of reduce()");
int pos = numPop-1;
holder[pos] = parent.pending();
- Forest rex = null;
if (pos==0) {
- if (rex==null) {
- System.arraycopy(holder, 0, position.holder, 0, holder.length);
- rex = position.rewrite(parent.phase().getLocation());
- }
+ System.arraycopy(holder, 0, position.holder, 0, holder.length);
+ return finish(onlychild, position.rewrite(parent.phase().getLocation()), parent.phase());
}
- return reduce(onlychild, pos-1, rex, parent.phase());
- }
-
- private Forest zero = null;
- public Forest zero() {
- if (zero != null) return zero;
- if (numPop > 0) throw new Error();
- return zero = position.rewrite(null);
+ return reduce(onlychild, pos-1, null, parent.phase());
}
// FIXME: this could be more elegant and/or cleaner and/or somewhere else
rex = position.rewrite(target.getLocation());
}
for(GSS.Phase.Node child : parent.parents())
+ //if (pos==0) finish(parent, rex, target);
+ //else
reduce(child, pos-1, rex, target);
return rex;
}