some simplifications to GSS, ResultNode, and StateNode
[sbp.git] / src / edu / berkeley / sbp / GSS.java
index 2d2e550..7666ec2 100644 (file)
@@ -18,9 +18,6 @@ class GSS {
     public GSS(Input input, Parser parser) { this.input = input; this.parser = parser;}
     public Input getInput() { return input; }
 
-    /*
-    HashSet<Reduction> finishedReductions = new HashSet<Reduction>();
-    */
     int numNewNodes = 0;
     int numOldNodes = 0;
     int viewPos = 0;
@@ -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();
@@ -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();
         }