X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FResult.java;h=c91ab769ec4d10261b4c32edb9b31bc9e0cad297;hp=97f467f7b6e35eb9d3067184251c5d8efb53b599;hb=6f1b2b1cba77222aeed1594d878b8c1250e31c1f;hpb=731f00e92c8a8e205678900bc038a8c24cf9b2ae diff --git a/src/edu/berkeley/sbp/Result.java b/src/edu/berkeley/sbp/Result.java index 97f467f..c91ab76 100644 --- a/src/edu/berkeley/sbp/Result.java +++ b/src/edu/berkeley/sbp/Result.java @@ -8,19 +8,41 @@ import java.util.*; final class Result implements GraphViz.ToGraphViz { - private Forest f; - private Node pred; - private HashSet successors = new HashSet(); + private Forest.Many f = new Forest.Many(); + //private HashSet predecessors = new HashSet(); + //private HashSet successors = new HashSet(); + private FastSet predecessors = new FastSet(); + private FastSet successors = new FastSet(); private boolean destroyed = false; + private boolean primordeal; private int usedByNonDoomedNode = 0; private Pos reduction; + private GSS.Phase predPhase; - public GSS.Phase phase() { return pred==null ? null : pred.phase(); } + public boolean predecessorsContains(Node n) { + return predecessors.contains(n); + } + public Pos reduction() { return reduction; } + public void merge(Forest newf) { + this.f.merge(newf); + /* + if (predecessors.contains(pred)) return; + addPred(pred); + if (fromEmptyReduction) return; + n.state().invokeReductions(n.phase().getToken(), n, this); + */ + } + + public boolean noSuccessors() { return successors.size()==0; } + + public GSS.Phase phase() { return predPhase; } public Forest getForest() { return f; } - public Node pred() { return pred; } + public Iterable getPreds() { return predecessors; } public void addSucc(Node succ) { + if (successors.contains(succ)) return; successors.add(succ); usedByNonDoomedNode += succ.state().doomed ? 0 : 1; + if (predecessors.size() > 1) throw new Error(); } public void removeSucc(Node succ) { if (!successors.contains(succ)) return; @@ -32,33 +54,54 @@ final class Result implements GraphViz.ToGraphViz { public boolean usedByAnyNode() { return successors.size() > 0; } public boolean usedByNonDoomedNode() { return usedByNonDoomedNode > 0; } - public String toString() { return super.toString()+"->"+pred(); } + public String toString() { return super.toString()+"->"+predPhase; } - public void check() { if (successors.size()==0) destroy(); } + public void check() { + if (successors.size()==0) destroy(); + else if (predecessors.size()==0) destroy(); + } public void destroy() { if (destroyed) return; - if (pred==null) return; // never destroy the "primordeal" result + if (primordeal) return; // never destroy the "primordeal" result destroyed = true; - pred.removeSucc(this); + while(predecessors.size() > 0) + for(Node pred : predecessors) { + removePred(pred); + pred.removeSucc(this); + break; + } + predecessors = null; while(successors.size() > 0) - for(Node n : successors) { - removeSucc(n); - n.removeResult(this); + for(Node succ : successors) { + removeSucc(succ); + succ.removeResult(this); break; } + successors = null; } - public static void newResult(Forest f, Node pred, Pos reduction, GSS.Phase target) { - Result r = new Result(f, pred, reduction); - if (reduction == null) return; - Parser.Table.State state0 = (Parser.Table.State)pred.state().gotoSetNonTerminals.get(reduction); - target.newNodeFromReduction(r, state0, reduction); + public void removePred(Node pred) { + if (!predecessors.contains(pred)) return; + predecessors.remove(pred); + check(); + } + + public void addPred(Node pred) { + if (predPhase==null) predPhase = pred.phase(); + if (predPhase != pred.phase()) throw new Error(); + predecessors.add(pred); + pred.addSucc(this); + if (predecessors.size() > 1) throw new Error(); + } + + public Result() { + this(null, null, null); + this.primordeal = true; } - public Result(Forest f, Node pred, Pos reduction) { - this.f = f; - this.pred = pred; + public Result(Forest f, Pos reduction, Node pred) { + this.f.merge(f); this.reduction = reduction; - if (pred != null) pred.addSucc(this); + if (pred != null) addPred(pred); } // GraphViz ////////////////////////////////////////////////////////////////////////////// @@ -68,7 +111,7 @@ final class Result implements GraphViz.ToGraphViz { GraphViz.Node n = gv.createNode(this); n.label = ""+f; n.shape = "rectangle"; - if (pred()!=null) n.edge(pred, ""); + //if (pred()!=null) n.edge(pred, ""); n.color = "blue"; if (phase() != null) ((GraphViz.Group)phase().toGraphViz(gv)).add(n);