From 39ab0c455ee3e3833a4e75529fce9af661ae6fe3 Mon Sep 17 00:00:00 2001 From: adam Date: Wed, 4 Jan 2006 03:43:08 -0500 Subject: [PATCH 1/1] checkpoint darcs-hash:20060104084308-5007d-7daa9e77c69ab2e108d4eefef031380cbf48ddb9.gz --- src/edu/berkeley/sbp/GSS.java | 35 +++++++++++++++++++++-------------- src/edu/berkeley/sbp/Sequence.java | 18 ++++++++++++++++-- 2 files changed, 37 insertions(+), 16 deletions(-) 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; } diff --git a/src/edu/berkeley/sbp/Sequence.java b/src/edu/berkeley/sbp/Sequence.java index 39e4b11..ee3fd4b 100644 --- a/src/edu/berkeley/sbp/Sequence.java +++ b/src/edu/berkeley/sbp/Sequence.java @@ -60,7 +60,17 @@ public abstract class Sequence extends Element implements Iterable { this.firstp = new Position(0); } - Forest epsilonForm() { return firstp().rewrite(null); } + // DO NOT MESS WITH THE FOLLOWING LINE!!! + private Forest.Ref epsilonForm = null; + private boolean eps = false; + Forest epsilonForm() { + if (epsilonForm==null) { + epsilonForm = new Forest.Ref(); + Forest fo = firstp().rewrite(null); + epsilonForm.merge(fo); + } + return epsilonForm; + } protected abstract Forest postReduce(Token.Location loc, Forest[] args); @@ -101,10 +111,13 @@ public abstract class Sequence extends Element implements Iterable { // Reduction ///////////////////////////////////////////////////////////////////////////////// - Forest rewrite(Token.Location loc) { + final Forest rewrite(Token.Location loc) { + if (this==firstp() && eps) return epsilonForm; + eps = true; for(int i=pos; i ret = Sequence.this.postReduce(loc, holder); for(int k=0; k { Forest[] args2 = new Forest[count]; int j = 0; for(int i=0; i