X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FParser.java;h=e5cd67cbeccd21cf65ef61ae9356a49486cb0dd9;hp=2fc0691e3dc4d307060b74a81fefd528d91c97e2;hb=24219bdf084b45273e869cd19382d1640b396566;hpb=6f1b2b1cba77222aeed1594d878b8c1250e31c1f diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index 2fc0691..e5cd67c 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -24,22 +24,79 @@ public abstract class Parser implements Serializable { /** parse input, and return the shared packed parse forest (or throw an exception) */ public Forest parse(Input 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 ids = new HashMap(); try { for(GSS.Phase current = gss.new Phase(pt.start); ;) { if (verbose) debug(current.token, gss, input); if (current.isDone()) return (Forest)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(current, forest); } } finally { if (verbose) { - System.err.print("\r"+ANSI.clreol()); + 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; i20) + use[j] = true; + for(int i=0; i=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 implements Serializable { * possible from it * * A state corresponds to a set of Sequence.Pos's. Each - * Node in the GSS has a State; the Node represents a set of + * StateNode in the GSS has a State; the StateNode represents a set of * possible parses, one for each Pos in the State. * * Every state is either "doomed" or "normal". If a Pos @@ -254,10 +311,10 @@ public abstract class Parser implements Serializable { * Nodes with non-doomed states represent nodes which * contribute to actual valid parses. Nodes with doomed * States exist for no other purpose than to enable/disable - * some future reduction from a non-doomed Node. Because of + * some future reduction from a non-doomed StateNode. Because of * this, we "garbage-collect" Nodes with doomed states if * there are no more non-doomed Nodes which they could - * affect (see Result, Reduction, and Node for details). + * affect (see Result, Reduction, and StateNode for details). * * Without this optimization, many seemingly-innocuous uses * of positive and negative conjuncts can trigger O(n^2) @@ -290,14 +347,14 @@ public abstract class Parser implements Serializable { Iterable positions() { return hs; } boolean canShift(Token t) { return oshifts!=null && oshifts.contains(t); } - void invokeShifts(Token t, GSS.Phase phase, Node pred, Forest f) { oshifts.invoke(t, phase, pred, f); } + void invokeShifts(Token t, GSS.Phase phase, StateNode pred, Forest f) { oshifts.invoke(t, phase, pred, f); } boolean canReduce(Token t) { return oreductions != null && (t==null ? eofReductions.size()>0 : oreductions.contains(t)); } - void invokeEpsilonReductions(Token t, Node node) { + void invokeEpsilonReductions(Token t, StateNode node) { if (t==null) for(Pos r : eofReductions) node.invoke(r, null, null); else oreductions.invoke(t, node, null, null); } - void invokeReductions(Token t, Node node, Result b) { + void invokeReductions(Token t, StateNode node, Result b) { if (t==null) for(Pos r : eofReductions) node.invoke(r, b, null); else oreductions.invoke(t, node, b, null); }