tentative checkpoint ROLL THIS BACK BUT INCLUDES CRUCIAL FIX
[sbp.git] / src / edu / berkeley / sbp / Parser.java
index bbcb032..c5ebd7e 100644 (file)
@@ -17,6 +17,10 @@ public abstract class Parser<Tok, Result> {
     /** implement this method to create the output forest corresponding to a lone shifted input token */
     public abstract Forest<Result> shiftToken(Tok t, Input.Location loc);
 
+    public boolean helpgc = true;
+
+    public String toString() { return pt.toString(); }
+
     /** parse <tt>input</tt>, using the table <tt>pt</tt> to drive the parser */
     public Forest<Result> parse(Input<Tok> input) throws IOException, ParseFailed {
         GSS gss = new GSS();
@@ -24,11 +28,21 @@ public abstract class Parser<Tok, Result> {
         GSS.Phase current = gss.new Phase<Tok>(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<Tok>(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<Result>)gss.finalResult;
             current = next;
@@ -40,6 +54,26 @@ public abstract class Parser<Tok, Result> {
     /** an SLR(1) parse table which may contain conflicts */
     static class Table<Tok> extends Walk.Cache {
 
+        public String toString() {
+            StringBuffer sb = new StringBuffer();
+            sb.append("parse table");
+            for(State<Tok> state : all_states.values()) {
+                sb.append("  " + state + "\n");
+                for(Topology<Tok> t : state.shifts) {
+                    sb.append("      shift  \""+
+                              new edu.berkeley.sbp.chr.CharTopology((IntegerTopology<Character>)t)+"\" => ");
+                    for(State st : state.shifts.getAll(t))
+                        sb.append(st.idx+"  ");
+                    sb.append("\n");
+                }
+                for(Topology<Tok> t : state.reductions)
+                    sb.append("      reduce \""+
+                              new edu.berkeley.sbp.chr.CharTopology((IntegerTopology<Character>)t)+"\" => " +
+                              state.reductions.getAll(t) + "\n");
+            }
+            return sb.toString();
+        }
+
         public final Walk.Cache cache = this;
 
         private void walk(Element e, HashSet<Element> hs) {
@@ -230,6 +264,14 @@ public abstract class Parser<Tok, Result> {
                 }
             }
 
+            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+"]: ");