X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FParser.java;h=0b2229d89be7c70741aff54cf0c50ef7ce0caaf6;hp=de96760406ee1a4f7b2452a2f63c092879855c5e;hb=2afdfe14e78fa0597186614937c679a09d74ecdf;hpb=c78e4efbba69fc058bbe487319b3abf5d94df3cb diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index de96760..0b2229d 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -30,33 +30,21 @@ public abstract class Parser { public Forest parse(Input input) throws IOException, ParseFailed { verbose = System.getProperty("sbp.verbose", null) != null; spinpos = 0; + GSS gss = new GSS(input, this); try { - GSS gss = new GSS(input, this); for(GSS.Phase current = gss.new Phase(pt.start); ;) { - - if (verbose) { - // FIXME: clean this up - 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 += " 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"); - } - + if (verbose) debug(current.token, gss, input); if (current.isDone()) return (Forest)current.finalResult; - Forest forest = shiftToken((Token)current.token, current.getRegion()); + Input.Region region = current.getLocation().createRegion(current.getNextLocation()); + Forest forest = shiftToken((Token)current.token, region); current = gss.new Phase(current, forest); } - } finally { if (verbose) System.err.print("\r"+ANSI.clreol()); } + } finally { + if (verbose) { + System.err.print("\r"+ANSI.clreol()); + debug(null, gss, input); + } + } } // Spinner ////////////////////////////////////////////////////////////////////////////// @@ -73,6 +61,52 @@ public abstract class Parser { System.err.print("\r " + spin[spinpos++ % (spin.length)]+"\r"); } + private int _last = -1; + private String buf = ""; + private void debug(Object t, GSS gss, Input input) { + //FIXME + int c = t==null ? -1 : ((t+"").charAt(0)); + int last = _last; + _last = c; + switch(c) { + case edu.berkeley.sbp.chr.CharAtom.left: + buf += "\033[31m{\033[0m"; + break; + case edu.berkeley.sbp.chr.CharAtom.right: + buf += "\033[31m}\033[0m"; + break; + case -1: // FIXME + case '\n': + if (verbose) { + if (last==' ') buf += ANSI.blue("\\n"); + System.err.println("\r"+ANSI.clreol()+"\r"+buf); + buf = ""; + } + break; + default: + buf += ANSI.cyan(""+((char)c)); + break; + } + if (t==null) return; + + // FIXME: clean this up + 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 += " nodes="+gss.numOldNodes; + while(s.length() < 50) s = s + " "; + s += " shifted="+gss.numNewNodes; + while(s.length() < 60) s = s + " "; + s += " reductions="+gss.numReductions; + while(s.length() < 78) s = s + " "; + System.err.print("\r"+ANSI.invert(s+ANSI.clreol())+"\r"); + } + // Table ////////////////////////////////////////////////////////////////////////////// /** an SLR(1) parse table which may contain conflicts */ @@ -253,6 +287,7 @@ public abstract class Parser { // Interface Methods ////////////////////////////////////////////////////////////////////////////// + public boolean doomed() { return doomed; } boolean isAccepting() { return accept; } public Iterator iterator() { return hs.iterator(); } boolean canShift(Token t) { return oshifts!=null && oshifts.contains(t); } @@ -382,6 +417,12 @@ public abstract class Parser { } public int toInt() { return idx; } + public String toString() { + StringBuffer ret = new StringBuffer(); + for(Position p : hs) + ret.append(p+"\n"); + return ret.toString(); + } } }