X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FGSS.java;h=497093682d0c02439aeb8a00aedc08c8f70b57c6;hp=dcc8f3353d89663922812885b8973dc46fefa4ba;hb=39ab0c455ee3e3833a4e75529fce9af661ae6fe3;hpb=7fbee73b4dd985cb5b217ed297710c00fd9d7004 diff --git a/src/edu/berkeley/sbp/GSS.java b/src/edu/berkeley/sbp/GSS.java index dcc8f33..4970936 100644 --- a/src/edu/berkeley/sbp/GSS.java +++ b/src/edu/berkeley/sbp/GSS.java @@ -115,14 +115,15 @@ class GSS { if (!fromEmptyReduction) n.queueReductions(); } + + boolean reducing = false; /** perform all reduction operations */ public void reduce() { + reducing = true; HashSet s = new HashSet(); s.addAll(hash.values()); - for(Phase.Node n : s) { - n.queueEmptyReductions(); - n.queueReductions(); - } + for(Phase.Node n : s) n.queueEmptyReductions(); + for(Phase.Node n : s) n.queueReductions(); while(pendingReduct.size()>0) //pendingReduct.iterator().next().go(); pendingReduct.removeFirst().go(); @@ -134,6 +135,7 @@ class GSS { Forest res = null; boolean ok = false; for(Phase.Node n : hash.values()) { + if (n.holder==null) continue; n.holder.resolve(); if (token == null && n.state.isAccepting()) { ok = true; @@ -154,10 +156,10 @@ class GSS { error.append("error: unable to shift token \"" + token + "\"\n"); error.append(" before: " +pendingReductions+ "\n"); error.append(" before: " +totalReductions+ "\n"); - for(Phase.Node n : hash.values()) { - n.queueReductions(); - n.queueEmptyReductions(); - } + //for(Phase.Node n : hash.values()) { + //n.queueReductions(); + //n.queueEmptyReductions(); + //} error.append(" after: " +pendingReductions+ "\n"); error.append(" candidate states:\n"); for(Phase.Node n : hash.values()) { @@ -213,9 +215,14 @@ class GSS { /** FIXME */ public void queueEmptyReductions() { - for(Parser.Table.Reduction r : token==null ? state.getEofReductions() : state.getReductions(token)) { - if (r.numPop==0) - newReduct(this, null, r); /* 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()); + Reduct red = new Reduct(this, null, r); + red.go(); /* ALLOC */ + } + } } } @@ -282,7 +289,7 @@ 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) new Reduct(n, n2, r)/*.go()*/; } @@ -295,7 +302,7 @@ class GSS { } 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 0/1" + // 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. @@ -338,5 +345,5 @@ class GSS { private static long code(Parser.Table.State state, Phase start) { return (((long)state.idx) << 32) | (start==null ? 0 : start.pos); } - + public boolean yak = false; }