+ /** parse <tt>input</tt>, and return the shared packed parse forest (or throw an exception) */
+ public Forest<NodeType> parse(Input<Token> input) throws IOException, ParseFailed {
+ verbose = System.getProperty("sbp.verbose", null) != null;
+ spinpos = 0;
+ try {
+ GSS gss = new GSS(input, this);
+ for(GSS.Phase current = gss.new Phase<Token>(pt.start); ;) {
+
+ if (verbose) {
+ String s;
+ s = " " + spin[spinpos++ % (spin.length)]+" parsing ";
+ s += input.getName();
+ s += " "+input.getLocation();
+ while(s.indexOf(':') != -1 && s.indexOf(':') < 8) s = " " + s;
+ String y = "@"+gss.viewPos+" ";
+ while(y.length() < 9) y = " " + y;
+ s += y;
+ //s += " doom="+Node.doomedNodes;
+ //while(s.length() < 40) s = s + " ";
+ s += " nodes="+gss.numOldNodes;
+ while(s.length() < 50) s = s + " ";
+ s += " shifted="+gss.numNewNodes;
+ while(s.length() < 60) s = s + " ";
+ s += " reductions="+gss.numReductions;
+ System.err.print("\r"+s+ANSI.clreol()+"\r");
+ }
+
+ // FIXME: make sure all the locations line up properly in here
+ if (current.isDone()) return (Forest<NodeType>)current.finalResult;
+ Forest forest = shiftToken((Token)current.token, input.getLocation());
+ current = gss.new Phase<Token>(current, forest);
+ }
+ } finally {
+ if (verbose)
+ System.err.print("\r \r");
+ }
+ }
+
+