From: adam Date: Wed, 11 Jan 2006 07:40:26 +0000 (-0500) Subject: checkpoint harmony X-Git-Tag: tag_for_25-Mar~398 X-Git-Url: http://git.megacz.com/?p=sbp.git;a=commitdiff_plain;h=1b46ed935f0fb6fb18afd40f5d1771be030a5a0d checkpoint harmony darcs-hash:20060111074026-5007d-67dafca4861663b670f64fbb3be9f79e8557ff34.gz --- diff --git a/src/edu/berkeley/sbp/GSS.java b/src/edu/berkeley/sbp/GSS.java index 86c93b2..5feba84 100644 --- a/src/edu/berkeley/sbp/GSS.java +++ b/src/edu/berkeley/sbp/GSS.java @@ -285,7 +285,7 @@ class GSS { } if (n==null) return; Forest[] holder = new Forest[r.position.pos]; - if (r.position.pos==0) r.finish(n, r.zero(), n.phase(), holder); + if (r.position.pos==0) n.finish(r, r.zero(), n.phase(), holder); else r.reduce(n, r.position.pos-1, n.phase(), holder); } else { Forest[] holder = new Forest[r.position.pos]; @@ -296,13 +296,21 @@ class GSS { if (pos==0) { System.arraycopy(holder, 0, r.position.holder, 0, holder.length); Forest rex = r.position.rewrite(n.phase().getLocation()); - r.finish(n2, rex, n.phase(), holder); + n2.finish(r, rex, n.phase(), holder); } else { r.reduce(n2, pos-1, n.phase(), holder); } holder[pos] = old; } } + + public void finish(Reduction r, Forest result, GSS.Phase target, Forest[] holder) { + State state0 = state.gotoSetNonTerminals.get(r.position.owner()); + if (result==null) throw new Error(); + if (state0!=null) + target.newNode(this, result, state0, r.position.pos<=0, r); + } + public void performEmptyReductions() { state.invokeReductions(token, this, null, null); } private Node(Node parent, Forest pending, State state) { diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index ee7a6f5..a156252 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -126,7 +126,7 @@ public abstract class Parser { public final int idx = master_state_idx++; private final HashSet hs; - private transient HashMap gotoSetNonTerminals = new HashMap(); + public transient HashMap gotoSetNonTerminals = new HashMap(); private transient TopologicalBag gotoSetTerminals = new TopologicalBag(); private TopologicalBag reductions = new TopologicalBag(); @@ -272,9 +272,6 @@ public abstract class Parser { return zero = position.rewrite(null); } - public void reduce(GSS.Phase.Node parent, GSS.Phase.Node onlychild) { - } - // FIXME: this could be more elegant and/or cleaner and/or somewhere else public void reduce(GSS.Phase.Node parent, int pos, GSS.Phase target, Forest[] holder) { Forest old = holder[pos]; @@ -283,18 +280,12 @@ public abstract class Parser { System.arraycopy(holder, 0, position.holder, 0, holder.length); for(int i=0; i