- protected Parser(Union u) { this.pt = new Table(u, top()); }
- protected Parser(Table pt) { this.pt = pt; }
-
- public abstract Forest<R> shiftedToken(T t, Token.Location loc);
- public abstract Topology<T> top();
-
-
- /** parse <tt>input</tt> for a exactly one unique result, throwing <tt>Ambiguous</tt> if not unique or <tt>Failed</tt> if none */
- public Tree<R> parse1(Token.Stream<T> input) throws IOException, Failed, Ambiguous {
- Forest<R> ret = parse(input);
- try { return ret.expand1(); }
- catch (Ambiguous a) {
- System.out.println("while expanding:");
- System.out.println(ret);
- throw a;
- }
- }
-
- /** parse <tt>input</tt>, using the table <tt>pt</tt> to drive the parser */
- public Forest<R> parse(Token.Stream<T> input) throws IOException, Failed {
- GSS gss = new GSS();
- Token.Location loc = input.getLocation();
- GSS.Phase current = gss.new Phase(null, input.next(), loc);
- current.newNode(null, null, pt.start, true, null);
- for(;;) {
- loc = input.getLocation();
- GSS.Phase next = gss.new Phase(current, input.next(), loc);
- current.reduce();
- Forest forest = current.token==null ? null : shiftedToken((T)current.token, loc);
- current.shift(next, forest);
- if (current.isDone()) return (Forest<R>)current.finalResult;
- current.checkFailure();
- current = next;
+ public Parser(Union u) { this.pt = new Table(u); }
+
+ /** implement this method to create the output forest corresponding to a lone shifted input token */
+ public abstract Forest<NodeType> shiftToken(Token t, Input.Region region);
+
+ public abstract Topology<Token> emptyTopology();
+
+ public String toString() { return pt.toString(); }
+
+ /** 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 {
+ long start = System.currentTimeMillis();
+ verbose = System.getProperty("sbp.verbose", null) != null;
+ spinpos = 0;
+ GSS gss = new GSS(input, this);
+ int idmax = 0;
+ int[][] count = new int[1024*1024][];
+ HashMap<Pos,Integer> ids = new HashMap<Pos,Integer>();
+ try {
+ for(GSS.Phase current = gss.new Phase<Token>(pt.start); ;) {
+ if (verbose) debug(current.token, gss, input);
+ if (current.isDone()) return (Forest<NodeType>)current.finalResult;
+ Input.Region region = current.getLocation().createRegion(current.getNextLocation());
+ Forest forest = shiftToken((Token)current.token, region);
+ /*
+ int maxid = 0;
+ for(Reduction r : gss.finishedReductions)
+ if (ids.get(r.reduction())==null)
+ ids.put(r.reduction(), idmax++);
+ count[current.pos] = new int[idmax];
+ for(Reduction r : gss.finishedReductions)
+ count[current.pos][ids.get(r.reduction())]++;
+ */
+ current = gss.new Phase<Token>(current, forest);
+ }
+ } finally {
+ if (verbose) {
+ long time = System.currentTimeMillis() - start;
+ System.err.println("\r parse time: " + time +"ms "+ ANSI.clreol());
+ debug(null, gss, input);
+ }
+ /*
+ PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("out.plot")));
+ boolean[] use = new boolean[idmax];
+ for(int i=0; i<count.length; i++)
+ if (count[i]!=null)
+ for(int j=0; j<count[i].length; j++)
+ if (count[i][j]>20)
+ use[j] = true;
+ for(int i=0; i<count.length; i++)
+ if (count[i]!=null) {
+ int row = 0;
+ for(int j=0; j<use.length; j++)
+ if (use[j]) {
+ row++;
+ pw.println(i+", "+row+", "+(j>=count[i].length ? 0 : count[i][j]));
+ }
+ pw.println();
+ }
+ pw.close();
+ pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("test.plot")));
+ pw.println("set terminal postscript enhanced color");
+ pw.println("set output \"out.ps\"");
+ pw.println("set pm3d map");
+ pw.println("set autoscale");
+ pw.println("set view 0,0");
+ pw.println("set ytics (\\");
+ int q = -1;
+ for(int j=0; j<use.length; j++)
+ if (use[j]) {
+ q++;
+ for(Pos p : ids.keySet())
+ if (ids.get(p) == j) {
+ String title = p.toString();
+ System.out.println(q + " " + title);
+ pw.println("\""+q+"\" "+(((double)q)+0.5)+",\\");
+ break;
+ }
+ }
+ pw.println("\".\" "+(q+1)+")");
+ pw.println("set size square");
+ pw.println("splot \"out.plot\"");
+ pw.close();
+ */