checkpoint
[sbp.git] / src / edu / berkeley / sbp / Forest.java
index d47e721..bfa4ecc 100644 (file)
@@ -39,7 +39,9 @@ public abstract class Forest<T> /*extends PrintableTree<Forest.MyBody<T>>*/ impl
         public void addTree(Tree<T> t);
     }
     public static class HashSetTreeConsumer<T> extends HashSet<Tree<T>> implements TreeConsumer<T> {
         public void addTree(Tree<T> t);
     }
     public static class HashSetTreeConsumer<T> extends HashSet<Tree<T>> implements TreeConsumer<T> {
-        public void addTree(Tree<T> t) { super.add(t); }
+        public void addTree(Tree<T> t) {
+            super.add(t);
+        }
     }
 
     static        <T> Forest<T> singleton(Input.Location loc, Position p) {
     }
 
     static        <T> Forest<T> singleton(Input.Location loc, Position p) {
@@ -58,6 +60,7 @@ public abstract class Forest<T> /*extends PrintableTree<Forest.MyBody<T>>*/ impl
         void expand(int i, TreeMaker<T> h);
     }
     public abstract void edges(GraphViz.Node n);
         void expand(int i, TreeMaker<T> h);
     }
     public abstract void edges(GraphViz.Node n);
+    public boolean ambiguous() { return false; }
     protected static class MyBody<T> extends Forest<T> implements Body<T> /* extends PrintableTree<Forest<T>> implements */ {
 
         public boolean isTransparent() { return false; }
     protected static class MyBody<T> extends Forest<T> implements Body<T> /* extends PrintableTree<Forest<T>> implements */ {
 
         public boolean isTransparent() { return false; }
@@ -67,6 +70,7 @@ public abstract class Forest<T> /*extends PrintableTree<Forest.MyBody<T>>*/ impl
             GraphViz.Node n = gv.createNode(this);
             n.label = headToString()==null?"":headToString();
             n.directed = true;
             GraphViz.Node n = gv.createNode(this);
             n.label = headToString()==null?"":headToString();
             n.directed = true;
+            n.comment = reduction==null?null:reduction+"";
             edges(n);
             return n;
         }
             edges(n);
             return n;
         }
@@ -75,7 +79,7 @@ public abstract class Forest<T> /*extends PrintableTree<Forest.MyBody<T>>*/ impl
             if (edges) return;
             edges = true;
             for(int i=0; i<tokens.length; i++) {
             if (edges) return;
             edges = true;
             for(int i=0; i<tokens.length; i++) {
-                if (i==tokens.length-1 && unwrap) {
+                if (i==tokens.length-1 && unwrap && !tokens[i].ambiguous()) {
                     tokens[i].edges(n);
                 } else {
                     n.edge(tokens[i], labels==null?null:labels[i]);
                     tokens[i].edges(n);
                 } else {
                     n.edge(tokens[i], labels==null?null:labels[i]);
@@ -152,6 +156,11 @@ public abstract class Forest<T> /*extends PrintableTree<Forest.MyBody<T>>*/ impl
      *  viewed, it becomes immutable
      */
     static class Ref<T> extends Forest<T> {
      *  viewed, it becomes immutable
      */
     static class Ref<T> extends Forest<T> {
+        public boolean ambiguous() {
+            if (hp.size()==0) return false;
+            if (hp.size()==1) return hp.iterator().next().ambiguous();
+            return true;
+        }
         private FastSet<Forest<T>> hp = new FastSet<Forest<T>>();
         public Ref() { }
         public int toInt() {
         private FastSet<Forest<T>> hp = new FastSet<Forest<T>>();
         public Ref() { }
         public int toInt() {
@@ -162,9 +171,12 @@ public abstract class Forest<T> /*extends PrintableTree<Forest.MyBody<T>>*/ impl
 
         public boolean isTransparent() { return hp.size()==1; }
         public boolean isHidden() { return hp.size()==0; }
 
         public boolean isTransparent() { return hp.size()==1; }
         public boolean isHidden() { return hp.size()==0; }
-        public void edges(GraphViz.Node n) { for(Forest f : hp) f.edges(n); }
+        public void edges(GraphViz.Node n) {
+            if (hp.size()==1) { hp.iterator().next().edges(n); return; }
+            for(Forest f : hp) f.edges(n);
+        }
         public GraphViz.Node toGraphViz(GraphViz gv) {
         public GraphViz.Node toGraphViz(GraphViz gv) {
-            if (hp.size()==0) return null;
+            //if (hp.size()==0) return null;
             if (hp.size()==1) return hp.iterator().next().toGraphViz(gv);
             if (gv.hasNode(this)) return gv.createNode(this);
             GraphViz.Node n = gv.createNode(this);
             if (hp.size()==1) return hp.iterator().next().toGraphViz(gv);
             if (gv.hasNode(this)) return gv.createNode(this);
             GraphViz.Node n = gv.createNode(this);