X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FParser.java;h=d258b7870675bbd35e722d42be0c4ef456e516f6;hp=f087a05e0ea93e48d909ed04fc2e562bb7f725fd;hb=f13be78d4291906d2f4c7588567cb114f0cc3b54;hpb=e4f373b56b1cdc2c086c0b86e5ec45bad784df0e diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index f087a05..d258b78 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -311,57 +311,49 @@ public abstract class Parser { } public String toString() { return "[reduce " + position + "]"; } - public Forest reduce(GSS.Phase.Node parent, GSS.Phase.Node onlychild, Forest rex) { - Forest ret = reduce(parent, numPop-1, rex, onlychild, parent.phase()); - return ret; + 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()); } public Forest reduce(GSS.Phase.Node parent, GSS.Phase.Node onlychild) { + if (numPop<=0) throw new Error("called wrong form of reduce()"); int pos = numPop-1; - if (pos>=0) holder[pos] = parent.pending(); - Forest rex = null; + holder[pos] = parent.pending(); 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, null, 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 - 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) { - 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 - for(GSS.Phase.Node child : parent.parents()) - reduce(child, pos-1, rex, null, target); - } else { - State state = parent.state.gotoSetNonTerminals.get(position.owner()); - if (state!=null) - target.newNode(parent, rex, state, numPop<=0, parent.phase()); + private Forest reduce(GSS.Phase.Node parent, int pos, Forest rex, GSS.Phase target) { + if (pos<0) return finish(parent, rex, target); + holder[pos] = parent.pending(); + if (pos==0 && rex==null) { + System.arraycopy(holder, 0, position.holder, 0, holder.length); + 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; } + private Forest finish(GSS.Phase.Node parent, Forest result, GSS.Phase target) { + State state = parent.state.gotoSetNonTerminals.get(position.owner()); + if (state!=null) + target.newNode(parent, result, state, numPop<=0, parent.phase()); + return result; + } } }