From 2c3a169319dbd868e53c889387fc3107f5095ec4 Mon Sep 17 00:00:00 2001 From: adam Date: Wed, 4 Jan 2006 06:14:30 -0500 Subject: [PATCH] checkpoint darcs-hash:20060104111430-5007d-5163a1269d96f1d41ba37e7e6dafe29c33ebe5f6.gz --- src/edu/berkeley/sbp/Parser.java | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index 08c49a9..868b200 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -318,40 +318,38 @@ public abstract class Parser { 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 void reduce(GSS.Phase.Node parent) { + if (numPop==0) finish(parent, zero(), parent.phase()); + else reduce(parent, numPop-1, parent.phase()); } - public Forest reduce(GSS.Phase.Node parent, GSS.Phase.Node onlychild) { + public void reduce(GSS.Phase.Node parent, GSS.Phase.Node onlychild) { if (numPop<=0) throw new Error("called wrong form of reduce()"); int pos = numPop-1; holder[pos] = parent.pending(); if (pos==0) { System.arraycopy(holder, 0, position.holder, 0, holder.length); - return finish(onlychild, position.rewrite(parent.phase().getLocation()), parent.phase()); + finish(onlychild, position.rewrite(parent.phase().getLocation()), parent.phase()); + } else { + reduce(onlychild, pos-1, parent.phase()); } - 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 target) { - if (pos<0) return finish(parent, rex, target); + private void reduce(GSS.Phase.Node parent, int pos, GSS.Phase target) { holder[pos] = parent.pending(); - if (pos==0 && rex==null) { + if (pos==0) { System.arraycopy(holder, 0, position.holder, 0, holder.length); - rex = position.rewrite(target.getLocation()); + Forest rex = position.rewrite(target.getLocation()); + for(GSS.Phase.Node child : parent.parents()) finish(child, rex, target); + } else { + for(GSS.Phase.Node child : parent.parents()) reduce(child, pos-1, target); } - for(GSS.Phase.Node child : parent.parents()) - if (pos==0) finish(child, rex, target); - else reduce(child, pos-1, rex, target); - return rex; } - private Forest finish(GSS.Phase.Node parent, Forest result, GSS.Phase target) { + private void 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; } } } -- 1.7.10.4