checkpoint harmony
[sbp.git] / src / edu / berkeley / sbp / GSS.java
index becea95..5bfbd52 100644 (file)
@@ -1,8 +1,8 @@
 package edu.berkeley.sbp;
 import edu.berkeley.sbp.*;
 import edu.berkeley.sbp.util.*;
+import edu.berkeley.sbp.Parser.Table.*;
 import edu.berkeley.sbp.Sequence.Position;
-import edu.berkeley.sbp.Parser.Table.State;
 import java.io.*;
 import java.util.*;
 import java.lang.reflect.*;
@@ -24,10 +24,14 @@ class GSS {
     public  Forest.Ref finalResult;
 
     /** corresponds to a positions <i>between tokens</i> the input stream; same as Tomita's U_i's */
-    public class Phase implements Invokable<State, Forest, GSS.Phase.Node>, IntegerMappable {
+    public class Phase<Tok> implements Invokable<State, Forest, Phase<Tok>.Node>, IntegerMappable {
+
+        public void invoke(State st, Forest result, Node n) {
+            good |= next.newNode(n, result, st, false);
+        }
 
         /** the token immediately after this phase */
-        final Token token;
+        final Tok token;
 
         private final int pos;
 
@@ -42,7 +46,7 @@ class GSS {
 
         private Forest forest;
 
-        public Phase(Phase prev, Parser parser, Phase previous, Token token, Token.Location location, Forest forest) {
+        public Phase(Phase prev, Parser parser, Phase previous, Tok token, Token.Location location, Forest forest) {
             this.prev = prev;
             this.forest = forest;
             this.parser = parser;
@@ -198,10 +202,6 @@ class GSS {
 
         class Reset extends RuntimeException { }
 
-        public void invoke(State st, Forest result, Node n) {
-            good |= next.newNode(n, result, st, false);
-        }
-
         /** perform all shift operations, adding promoted nodes to <tt>next</tt> */
         public void shift(Phase next, Forest result) throws ParseFailed {
             // this massively improves GC performance
@@ -257,7 +257,7 @@ class GSS {
             private boolean allqueued = false;
 
             /** what state this node is in */
-            public final State state;
+            public final Parser.Table<Tok>.State<Tok> state;
 
             /** which Phase this Node belongs to (node that Node is also a non-static inner class of Phase) */
             public  Phase phase() { return Phase.this; }
@@ -303,22 +303,22 @@ class GSS {
                 }
             }
 
-            public void reduce(Position r, int pos, GSS.Phase target, Forest[] holder) {
+            public void reduce(Position r, int pos, Phase target, Forest[] holder) {
                 Forest old = holder[pos];
                 holder[pos] = this.pending();
                 if (pos==0) {
                     System.arraycopy(holder, 0, r.holder, 0, holder.length);
                     for(int i=0; i<r.pos; i++) if (r.holder[i]==null) throw new Error("realbad");
                     Forest rex = r.rewrite(target.getLocation());
-                    for(GSS.Phase.Node child : this.parents()) child.finish(r, rex, target, holder);
+                    for(Node child : this.parents()) child.finish(r, rex, target, holder);
                 } else {
-                    for(GSS.Phase.Node child : this.parents()) child.reduce(r, pos-1, target, holder);
+                    for(Node child : this.parents()) child.reduce(r, pos-1, target, holder);
                 }
                 holder[pos] = old;
             }
 
-            public void finish(Position r, Forest result, GSS.Phase target, Forest[] holder) {
-                State state0 = state.gotoSetNonTerminals.get(r.owner());
+            public void finish(Position r, Forest result, Phase<Tok> target, Forest[] holder) {
+                Parser.Table<Tok>.State<Tok> state0 = state.gotoSetNonTerminals.get(r.owner());
                 if (result==null) throw new Error();
                 if (state0!=null)
                     target.newNode(this, result, state0, r.pos<=0, r);