tentative checkpoint
authoradam <adam@megacz.com>
Mon, 29 May 2006 21:54:31 +0000 (17:54 -0400)
committeradam <adam@megacz.com>
Mon, 29 May 2006 21:54:31 +0000 (17:54 -0400)
darcs-hash:20060529215431-5007d-725df35fdd3c552c95bcd97c583f37df6f66cd3e.gz

src/edu/berkeley/sbp/Forest.java
src/edu/berkeley/sbp/GSS.java
src/edu/berkeley/sbp/misc/MetaGrammarTree.java

index 1b92a76..bc31117 100644 (file)
@@ -160,6 +160,9 @@ public abstract class Forest<T> /*extends PrintableTree<Forest.MyBody<T>>*/
      */
     static class Ref<T> extends Forest<T> {
         public HashSet<GSS.Phase.Node> parents = new HashSet<GSS.Phase.Node>();
+        public boolean contains(Forest f) {
+            return hp.contains(f);
+        }
         public boolean ambiguous() {
             if (hp.size()==0) return false;
             if (hp.size()==1) return hp.iterator().next().ambiguous();
index 65af62e..9b091a7 100644 (file)
@@ -146,13 +146,15 @@ class GSS {
                 }
             }
         }
+
         private boolean newNode2(Node p, Node parent, Forest pending, State state, boolean fromEmptyReduction) {
             //if (p.parents().contains(parent)) return true;
-            p.merge(parent, pending);
+            if (p.merge(parent, pending)) return true;
             p.parents().add(parent, true);
             if (p!=parent && !fromEmptyReduction && reducing) p.performReductions(parent);
             return true;
         }
+
         private boolean newNode3(Node parent, Forest pending, State state, boolean fromEmptyReduction) {
             do {
                 if (token != null && state.canShift(token)) break;
@@ -287,8 +289,6 @@ class GSS {
         public boolean isTransparent() { return false; }
         public boolean isHidden() { return false; }
 
-
-            //private Forest.Ref holder = new Forest.Ref();
             private boolean allqueued = false;
 
             /** what state this node is in */
@@ -296,14 +296,15 @@ class GSS {
 
             /** which Phase this Node belongs to (node that Node is also a non-static inner class of Phase) */
             public  Phase phase() { return Phase.this; }
-            //private HashMap<Node,Forest> resultMap = new HashMap<Node,Forest>();
 
             private HashSet<Forest.Ref> resultMap = new HashSet<Forest.Ref>();
-            public void merge(Node parent, Forest result) {
+            public Iterable<Forest.Ref> results() { return resultMap; }
+            public FastSet<Node> parents() { return set; }
+            public boolean merge(Node parent, Forest result) {
                 for(Forest.Ref f : results()) {
-                    if (f.parents.contains(parent) && f.parents.size()==1) {
+                    if (f.parents.contains(parent) /* UGLY: */ && f.parents.size()==1) {
                         f.merge(result);
-                        return;
+                        return true;
                     }
                 }
                 Forest.Ref f = new Forest.Ref();
@@ -311,27 +312,8 @@ class GSS {
                 f.merge(result);
                 resultMap.add(f);
                 set.add(parent, true);
-                /*
-                Forest.Ref f = (Forest.Ref)resultMap.get(parent);
-                if (f==null) { f = new Forest.Ref(); resultMap.put(parent, f); }
-                f.merge(result);
-                set.add(parent, true);
-                */
-            }
-            public Iterable<Forest.Ref> results() { return resultMap; }
-            //private Forest pending(Node n) {
-                //return !Phase.this.closed ? holder : holder.resolve();
-                /*
-                for(Forest f : resultMap)
-                    if (resultMap.contains(f, n))
-                        return f;
-                return null;
-                */
-            /*
-                return resultMap.get(n);
+                return false;
             }
-            */
-            public  FastSet<Node> parents() { return set; }
 
             public void performReductions() {
                 if (allqueued) return;
@@ -346,7 +328,6 @@ class GSS {
 
             public void performEmptyReductions() { state.invokeReductions(token, this, null, null); }
             public final void invoke(Position r, Node n, Node n2) {
-                //if (r.owner().lame) return;
                 if (n==null || n2==null || r.pos==0) {
                     if (r.pos==0) {
                         if (n==null) n = this;
@@ -367,11 +348,6 @@ class GSS {
             public void reduce(Position r, int pos, Phase target, Forest[] holder, Node only) {
                 Forest old = holder[pos];
 
-                // FIXME: I'm unsure about this -- basically we want to deal with the case where
-                //        there are two nodes, each of whose Ref points to the same Forest instance.
-                //        Some node in the next phase has both of these as parents.  This might happen
-                //        since the same reduction can appear in more than one state.
-                
                 for(Forest result : results())
                     for(Node child : ((Forest.Ref<?>)result).parents) {
                         if (only != null && child!=only) continue;
index 3fccd34..6191299 100644 (file)
@@ -71,6 +71,9 @@ public class MetaGrammarTree {
 
 
 
+
+
+
         // DO NOT EDIT STUFF BELOW: IT IS AUTOMATICALLY GENERATED
 new edu.berkeley.sbp.Tree(null, "grammar", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "=", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "G", new edu.berkeley.sbp.Tree[] { }),
         new edu.berkeley.sbp.Tree(null, "r", new edu.berkeley.sbp.Tree[] { }),
@@ -618,3 +621,6 @@ new edu.berkeley.sbp.Tree(null, "grammar", new edu.berkeley.sbp.Tree[] { new edu
 
 
 
+
+
+