X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FStateNode.java;h=4b7834e0ffe66e1dfdffbbd7b1c6c21bca202c40;hp=8fb1fd71bd6ef638d16821df0d158a485d4204b9;hb=c404939a6dfed4dcfdca5ede08db99b3e5ef0c91;hpb=24219bdf084b45273e869cd19382d1640b396566 diff --git a/src/edu/berkeley/sbp/StateNode.java b/src/edu/berkeley/sbp/StateNode.java index 8fb1fd7..4b7834e 100644 --- a/src/edu/berkeley/sbp/StateNode.java +++ b/src/edu/berkeley/sbp/StateNode.java @@ -12,18 +12,15 @@ import java.lang.reflect.*; /** a node in the GSS */ final class StateNode - implements Invokable, - IntegerMappable, - GraphViz.ToGraphViz, - Iterable { + extends Node + implements Invokable, + Iterable { /** which GSS.Phase this StateNode belongs to */ public GSS.Phase phase() { return phase; } - public Iterator iterator() { return results.iterator(); } + public Iterator iterator() { return predecessors.iterator(); } public Parser.Table.State state() { return state; } - public int toInt() { return idx; } - boolean destroyed = false; public void check() { @@ -34,45 +31,38 @@ final class StateNode // - be on the frontier or // - have a non-doomed node closer to the frontier than themself if (phase.isFrontier()) dead = false; - else for(Result r : successors) + else for(ResultNode r : successors) if (state.doomed) { if (r.usedByAnyNode()) { dead = false; break; } } else { if (r.usedByNonDoomedNode()) { dead = false; break; } } - dead |= results.size()==0; + dead |= predecessors.size()==0; if (!dead) return; destroyed = true; if (phase() != null && phase().hash != null) phase().hash.remove(state, predPhase); while(successors.size()>0) - for(Result r : successors) { + for(ResultNode r : successors) { successors.remove(r); r.removePred(this); break; } - while(results.size()>0) - for(Result r : results) { - results.remove(r); + while(predecessors.size()>0) + for(ResultNode r : predecessors) { + predecessors.remove(r); r.removeSucc(this); break; } - results = null; + predecessors = null; successors = null; } ////////////////////////////////////////////////////////////////////// - private static int node_idx = 0; - private final int idx = node_idx++; - private final GSS.Phase phase; private final GSS.Phase predPhase; private final Parser.Table.State state; private boolean fromEmptyReduction; - private FastSet results = new FastSet(); - private FastSet successors = new FastSet(); - //private HashSet results = new HashSet(); - //private HashSet successors = new HashSet(); - public final void invoke(Pos r, Result only, Object o) { + public final void invoke(Pos r, ResultNode only, Object o) { boolean emptyProductions = only==null; if (emptyProductions != (r.numPops()==0)) return; if (r.numPops()!=0) reduce(r, r.numPops()-1, phase(), only); @@ -82,8 +72,8 @@ final class StateNode } } - private void reduce(Pos r, int pos, GSS.Phase target, Result only) { - for(Result res : results) + private void reduce(Pos r, int pos, GSS.Phase target, ResultNode only) { + for(ResultNode res : predecessors) if (only == null || res == only) for(StateNode pred : res.getPreds()) reduce2(r, pos, target, pred, res.getForest()); @@ -102,9 +92,9 @@ final class StateNode } StateNode(GSS.Phase phase, Forest f, Pos reduction, StateNode pred, State state, boolean fromEmptyReduction) { - this(phase, new Result(f, reduction, pred), state, fromEmptyReduction); + this(phase, new ResultNode(f, reduction, pred), state, fromEmptyReduction); } - StateNode(GSS.Phase phase, Result pred, State state, boolean fromEmptyReduction) { + StateNode(GSS.Phase phase, ResultNode pred, State state, boolean fromEmptyReduction) { this.phase = phase; this.state = state; this.fromEmptyReduction = fromEmptyReduction; @@ -112,7 +102,7 @@ final class StateNode this.predPhase = pred.phase(); phase.hash.put(state, pred.phase(), this); - results.add(pred); + predecessors.add(pred); pred.addSucc(this); if (!fromEmptyReduction) state.invokeReductions(phase().getToken(), this, pred); @@ -120,46 +110,28 @@ final class StateNode state.invokeEpsilonReductions(phase().token, this); } - // Add/Remove Successors/Results ////////////////////////////////////////////////////////////////////////////// + // Add/Remove Successors/Predecessors ////////////////////////////////////////////////////////////////////////////// - public void removeSucc(Result succ) { + public void removeSucc(ResultNode succ) { successors.remove(succ); check(); } - public void removeResult(Result result) { - results.remove(result); + public void removeResult(ResultNode result) { + predecessors.remove(result); check(); } - public void addSucc(Result succ) { + public void addSucc(ResultNode succ) { successors.add(succ); } public void addResult(Forest f, Pos reduction, StateNode pred) { - for(Result r : results) + for(ResultNode r : predecessors) if (r.predecessorsContains(pred)) { r.merge(f); return; } - Result result = new Result(f, reduction, pred); - results.add(result); + ResultNode result = new ResultNode(f, reduction, pred); + predecessors.add(result); result.addSucc(this); if (!this.fromEmptyReduction) state.invokeReductions(phase().getToken(), this, result); } - - // GraphViz ////////////////////////////////////////////////////////////////////////////// - - public GraphViz.StateNode toGraphViz(GraphViz gv) { - if (results.size()==0) return null; - if (gv.hasNode(this)) return gv.createNode(this); - GraphViz.StateNode n = gv.createNode(this); - n.label = "state["+state.toInt()+"]"; - n.shape = "rectangle"; - boolean haspreds = false; - for(Result r : results) n.edge(r, ""); - n.color = state.doomed ? "red" : "green"; - ((GraphViz.Group)phase().toGraphViz(gv)).add(n); - return n; - } - public boolean isTransparent() { return false; } - public boolean isHidden() { return false; } - }