X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FGSS.java;h=81e4909300a2beaadcf0ffe27624cb17a480040c;hp=2d2e550cce16e613bec3951d8d8a348a0ba949d9;hb=HEAD;hpb=76ce41540f06ac1fbcb44332dd62f53e88c27cf1 diff --git a/src/edu/berkeley/sbp/GSS.java b/src/edu/berkeley/sbp/GSS.java index 2d2e550..81e4909 100644 --- a/src/edu/berkeley/sbp/GSS.java +++ b/src/edu/berkeley/sbp/GSS.java @@ -18,16 +18,13 @@ class GSS { public GSS(Input input, Parser parser) { this.input = input; this.parser = parser;} public Input getInput() { return input; } - /* - HashSet finishedReductions = new HashSet(); - */ int numNewNodes = 0; int numOldNodes = 0; int viewPos = 0; int numReductions = 0; /** corresponds to a positions between tokens the input stream; same as Tomita's U_i's */ - class Phase implements Invokable, IntegerMappable, GraphViz.ToGraphViz, Iterable { + class Phase implements Invokable, IntegerMappable, GraphViz.ToGraphViz /*, Iterable*/ { // FIXME: right now, these are the performance bottleneck private HashMapBag performed = new HashMapBag(); @@ -44,7 +41,7 @@ class GSS { public void invoke(State st, StateNode pred, Forest f) { parser.spin(); - good |= next.newNode(f, null, pred, st, false); + good |= next.newNode(f, null, pred, st); } /** the token immediately after this phase */ @@ -61,7 +58,7 @@ class GSS { public Phase(State startState) throws ParseFailed, IOException { this(null, null); - newNode(null, null, null, startState, true); + newNode(null, null, null, startState); } public Phase(Phase prev, Forest forest) throws ParseFailed, IOException { this.location = input.getLocation(); @@ -131,7 +128,7 @@ class GSS { for(StateNode n : h) n.check(); } numOldNodes = hash.size(); - for(StateNode n : hash.values()) { + for(StateNode n : hash) { if (token == null && n.state().isAccepting()) { if (finalResult==null) finalResult = new Forest.Many(); for(ResultNode r : n) @@ -179,32 +176,32 @@ class GSS { performed.add(pos, reduction.provides()); Parser.Table.State state = (Parser.Table.State)pred.state().gotoSetNonTerminals.get(reduction); if (state!=null) - newNode(f, reduction, pred, state, reduction.numPops()<=0); + newNode(f, reduction, pred, state); } /** add a new node (merging with existing nodes if possible) * @param parent the parent of the new node * @param result the SPPF result corresponding to the new node * @param state the state that the new node is in - * @param fromEmptyReduction true iff this node is being created as a result of a reduction of length zero (see GRMLR paper) * @param start the earliest part of the input contributing to this node (used to make merging decisions) */ - private boolean newNode(Forest f, Pos reduction, StateNode pred, State state, boolean fromEmptyReduction) { + private boolean newNode(Forest f, Pos reduction, StateNode pred, State state) { StateNode p = pred==null ? null : hash.get(state, pred.phase()); if (p != null) { p.addPred(f, reduction, pred); return !state.doomed(); } do { + // optimizations if (token != null && state.canShift(token)) break; if (state.isAccepting()) break; if (token==null) break; if (!state.canReduce(token)) return false; } while(false); - StateNode n = new StateNode(Phase.this, f, reduction, pred, state, fromEmptyReduction); // ALLOC + StateNode n = new StateNode(Phase.this, new ResultNode(f, reduction, pred), state); // ALLOC /** FIXME: this null-result can be used to notice bogus/dead states */ for(Object s : state.conjunctStates) - newNode(null, null, n, (State)s, fromEmptyReduction); + newNode(null, null, n, (State)s); return !n.state().doomed(); } @@ -212,7 +209,7 @@ class GSS { public int size() { return hash==null ? 0 : hash.size(); } public int pos() { return pos; } public Tok getToken() { return token; } - public Iterator iterator() { return hash.iterator(); } + //public Iterator iterator() { return hash.iterator(); } public GSS getGSS() { return GSS.this; } // GraphViz ////////////////////////////////////////////////////////////////////////////// @@ -232,8 +229,10 @@ class GSS { FileOutputStream fos = new FileOutputStream(filename); PrintWriter p = new PrintWriter(new OutputStreamWriter(fos)); GraphViz gv = new GraphViz(); + /* for(Object n : this) ((StateNode)n).toGraphViz(gv); + */ gv.dump(p); p.flush(); p.close();