From ea98ead8a9a46a7314da6faac96a31bfecd7002b Mon Sep 17 00:00:00 2001 From: adam Date: Wed, 4 Jan 2006 03:49:21 -0500 Subject: [PATCH] checkpoint darcs-hash:20060104084921-5007d-efe171e31561d14c8c2458e3973294ec21cdc443.gz --- src/edu/berkeley/sbp/GSS.java | 56 +++++++++++++++++------------------------ 1 file changed, 23 insertions(+), 33 deletions(-) diff --git a/src/edu/berkeley/sbp/GSS.java b/src/edu/berkeley/sbp/GSS.java index 4970936..26b6448 100644 --- a/src/edu/berkeley/sbp/GSS.java +++ b/src/edu/berkeley/sbp/GSS.java @@ -215,15 +215,10 @@ class GSS { /** FIXME */ public void queueEmptyReductions() { - if (reducing) { - for(Parser.Table.Reduction r : token==null ? state.getEofReductions() : state.getReductions(token)) { - if (r.numPop==0) { - //r.reduce(this, null, this.phase, r.zero()); - Reduct red = new Reduct(this, null, r); - red.go(); /* ALLOC */ - } - } - } + if (reducing) + for(Parser.Table.Reduction r : token==null ? state.getEofReductions() : state.getReductions(token)) + if (r.numPop==0) + r.reduce(this, null, this.phase, r.zero()); } private Node(Node parent, Forest pending, Parser.Table.State state, Phase start) { @@ -270,6 +265,7 @@ class GSS { reductions.add(this); pendingReduct.addFirst(this); pendingReductions++; + //if (reducing) go(); } /** perform the reduction */ @@ -279,9 +275,20 @@ class GSS { pendingReduct.remove(this); pendingReductions--; - if (r==null) + if (r==null) { for(Parser.Table.Reduction r : token==null ? n.state.getEofReductions() : n.state.getReductions(token)) { + // UGLY HACK + // The problem here is that a "reduction of length 1" + // performed twice with different values of n2 needs + // to only create a *single* new result, but must add + // multiple parents to the node holding that result. + // The current reducer doesn't differentiate between + // the next node of an n-pop reduction and the + // ultimate parent of the last pop, so we need to + // cache instances here as a way of avoiding + // recreating them. + // currently we have this weird problem where we // have to do an individual reduct for each child // when the reduction length is one (ie the @@ -289,34 +296,17 @@ class GSS { // created node rather than part of the popped // sequence - if (r.numPop == 1) new Reduct(n, n2, r)/*.go()*/; + if (r.numPop == 1) { + Forest ret = n.cache().get(r); + if (ret != null) r.reduce(n, n2, n.phase, ret); + else n.cache().put(r, r.reduce(n, n2, n.phase, null)); + } } - - - // FIXME: explain this - if (r==null) { for(Parser.Table.Reduction r : token==null ? n.state.getEofReductions() : n.state.getReductions(token)) { if (r.numPop <= 1) continue; r.reduce(n, n2, Phase.this, null); } - } else if (r.numPop==0) { r.reduce(n, n2, n.phase, r.zero()); - } else if (r.numPop==1) { - // UGLY HACK - // The problem here is that a "reduction of length 1" - // performed twice with different values of n2 needs - // to only create a *single* new result, but must add - // multiple parents to the node holding that result. - // The current reducer doesn't differentiate between - // the next node of an n-pop reduction and the - // ultimate parent of the last pop, so we need to - // cache instances here as a way of avoiding - // recreating them. - - Forest ret = n.cache().get(r); - if (ret != null) r.reduce(n, n2, n.phase, ret); - else n.cache().put(r, r.reduce(n, n2, n.phase, null)); - - } else { + } else if (r.numPop != 1) { r.reduce(n, n2, Phase.this, null); } } -- 1.7.10.4