X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FParser.java;h=dc6c1f6d38f4e727be22d572e78703093dc69a0c;hp=f37c5751b1a636c18dd2fd668c084d3f7d4c4c2a;hb=c263c1e02119917a9d63ab14db9711c7d1cb4d9d;hpb=f71911854d01647a743d52bfccff8d78a4497550 diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index f37c575..dc6c1f6 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -310,12 +310,10 @@ public abstract class Parser { this.holder = new Forest[numPop]; } public String toString() { return "[reduce " + position + "]"; } - public Forest reduce(Forest f, GSS.Phase.Node parent, GSS.Phase.Node onlychild, GSS.Phase target, Forest rex) { - holder[numPop-1] = f; - return reduce(parent, numPop-2, rex, onlychild, target); - } + public Forest reduce(GSS.Phase.Node parent, GSS.Phase.Node onlychild, Forest rex) { - return reduce(parent, numPop-1, rex, onlychild, parent.phase()); + Forest ret = reduce(parent, numPop-1, rex, onlychild, parent.phase()); + return ret; } private Forest zero = null; @@ -328,11 +326,17 @@ public abstract class Parser { // FIXME: this could be more elegant and/or cleaner and/or somewhere else private Forest reduce(GSS.Phase.Node parent, int pos, Forest rex, GSS.Phase.Node onlychild, GSS.Phase target) { if (pos>=0) holder[pos] = parent.pending(); - if (pos<=0 && rex==null) { - System.arraycopy(holder, 0, position.holder, 0, holder.length); - rex = position.rewrite(target.getLocation()); - } - if (pos >=0) { + if (pos==0) { + if (rex==null) { + System.arraycopy(holder, 0, position.holder, 0, holder.length); + rex = position.rewrite(target.getLocation()); + } + if (onlychild != null) + reduce(onlychild, pos-1, rex, null, target); + else + for(GSS.Phase.Node child : parent.parents()) + reduce(child, pos-1, rex, null, target); + } else if (pos>0) { if (onlychild != null) reduce(onlychild, pos-1, rex, null, target); else