UnwrapLeft, error reporting improvements
[sbp.git] / src / edu / berkeley / sbp / Result.java
index 10a9b94..95baeba 100644 (file)
@@ -1,26 +1,19 @@
 // Copyright 2006 all rights reserved; see LICENSE file for BSD-style license
 
 package edu.berkeley.sbp;
-import edu.berkeley.sbp.*;
 import edu.berkeley.sbp.util.*;
-import edu.berkeley.sbp.Parser.Table.*;
 import edu.berkeley.sbp.Sequence.Position;
-import java.io.*;
 import java.util.*;
-import java.lang.reflect.*;
 
 final class Result implements GraphViz.ToGraphViz {
 
     private Forest f;
     private Node parent;
-    private GSS.Phase phase;
-    private Position reduction;
     private HashSet<Node> children = new HashSet<Node>();
     private boolean destroyed = false;
     private int usedByNonDoomedNode = 0;
 
-    public Position reduction() { return reduction; }
-    public GSS.Phase phase() { return phase; }
+    public GSS.Phase phase() { return parent==null ? null : parent.phase(); }
     public Forest getForest() { return f; }
     public Node parent() { return parent; }
     public void addChild(Node child) {
@@ -28,8 +21,10 @@ final class Result implements GraphViz.ToGraphViz {
         usedByNonDoomedNode += child.state().doomed ? 0 : 1;
     }
     public void removeChild(Node child) {
+        if (!children.contains(child)) return;
         children.remove(child);
         usedByNonDoomedNode -= child.state().doomed ? 0 : 1;
+        check();
     }
 
     public boolean usedByAnyNode() { return children.size() > 0; }
@@ -42,27 +37,25 @@ final class Result implements GraphViz.ToGraphViz {
         if (destroyed) return;
         if (parent==null) return;  // never destroy the "primordeal" result
         destroyed = true;
-        if (parent() != null) {
-            parent().removeChild(this);
-            parent().check();
-        }
-        OUTER: while(true) {
+        parent.removeChild(this);
+        while(children.size() > 0)
             for(Node n : children) {
-                children.remove(n);
+                removeChild(n);
                 n.removeResult(this);
-                n.check();
-                continue OUTER;
+                break;
             }
-            break;
-        }
     }
 
     public Result(Forest f, Node parent, Position reduction) {
+        this(f, parent, reduction, null);
+    }
+    public Result(Forest f, Node parent, Position reduction, GSS.Phase target) {
         this.f = f;
-        this.reduction = reduction;
         this.parent = parent;
         if (parent != null) parent.addChild(this);
-        if (parent != null) phase = parent.phase();
+        if (reduction == null) return;
+        Parser.Table.State state0 = (Parser.Table.State)parent.state().gotoSetNonTerminals.get(reduction.owner());
+        target.newNodeFromReduction(this, state0, reduction);
     }
 
     // GraphViz //////////////////////////////////////////////////////////////////////////////