X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FParser.java;h=c5ebd7e3f976abe6aae942895e5bdefdb4ce57e8;hp=bbcb032c932c12977b975037b8cc1891574c3273;hb=e5cfb136bf7fd1352eff1bd87a458aa4ff748537;hpb=6ae224025882c9929e2e4e9e8461decbf3b9cae4 diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index bbcb032..c5ebd7e 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -17,6 +17,10 @@ public abstract class Parser { /** implement this method to create the output forest corresponding to a lone shifted input token */ public abstract Forest shiftToken(Tok t, Input.Location loc); + public boolean helpgc = true; + + public String toString() { return pt.toString(); } + /** parse input, using the table pt to drive the parser */ public Forest parse(Input input) throws IOException, ParseFailed { GSS gss = new GSS(); @@ -24,11 +28,21 @@ public abstract class Parser { GSS.Phase current = gss.new Phase(null, this, null, input.next(), loc, null); current.newNode(null, Forest.leaf(null, null, null), pt.start, true); int count = 1; - for(;;) { + for(int idx=0;;idx++) { loc = input.getLocation(); current.reduce(); Forest forest = current.token==null ? null : shiftToken((Tok)current.token, loc); GSS.Phase next = gss.new Phase(current, this, current, input.next(), loc, forest); + if (!helpgc) { + FileOutputStream fos = new FileOutputStream("out-"+idx+".dot"); + PrintWriter p = new PrintWriter(new OutputStreamWriter(fos)); + GraphViz gv = new GraphViz(); + for(Object n : next) + ((GSS.Phase.Node)n).toGraphViz(gv); + gv.dump(p); + p.flush(); + p.close(); + } count = next.size(); if (current.isDone()) return (Forest)gss.finalResult; current = next; @@ -40,6 +54,26 @@ public abstract class Parser { /** an SLR(1) parse table which may contain conflicts */ static class Table extends Walk.Cache { + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append("parse table"); + for(State state : all_states.values()) { + sb.append(" " + state + "\n"); + for(Topology t : state.shifts) { + sb.append(" shift \""+ + new edu.berkeley.sbp.chr.CharTopology((IntegerTopology)t)+"\" => "); + for(State st : state.shifts.getAll(t)) + sb.append(st.idx+" "); + sb.append("\n"); + } + for(Topology t : state.reductions) + sb.append(" reduce \""+ + new edu.berkeley.sbp.chr.CharTopology((IntegerTopology)t)+"\" => " + + state.reductions.getAll(t) + "\n"); + } + return sb.toString(); + } + public final Walk.Cache cache = this; private void walk(Element e, HashSet hs) { @@ -230,6 +264,14 @@ public abstract class Parser { } } + public String toStringx() { + StringBuffer st = new StringBuffer(); + for(Position p : this) { + if (st.length() > 0) st.append("\n"); + st.append(p); + } + return st.toString(); + } public String toString() { StringBuffer ret = new StringBuffer(); ret.append("state["+idx+"]: ");