fixed the ugly comma bug; still unsure of the ultimate solution
authoradam <adam@megacz.com>
Sat, 11 Feb 2006 09:50:20 +0000 (04:50 -0500)
committeradam <adam@megacz.com>
Sat, 11 Feb 2006 09:50:20 +0000 (04:50 -0500)
darcs-hash:20060211095020-5007d-dcefaed5deef35138c978cb72514cb78afe29d8b.gz

src/edu/berkeley/sbp/Forest.java
src/edu/berkeley/sbp/GSS.java
tests/input.tibdoc

index e74d81e..98e8e4b 100644 (file)
@@ -7,7 +7,11 @@ import java.util.*;
 import java.lang.reflect.*;
 
 /** an efficient representation of a collection of trees (Tomita's shared packed parse forest) */
-public abstract class Forest<T> /*extends PrintableTree<Forest.MyBody<T>>*/ implements Visitable<Forest.Body<T>> {
+public abstract class Forest<T> /*extends PrintableTree<Forest.MyBody<T>>*/ implements Visitable<Forest.Body<T>>, IntegerMappable {
+
+    private static int master_idx = 0;
+    private final int idx = master_idx++;
+    public int toInt() { return idx; }
 
     /** assume that this forest contains exactly one tree and return it; otherwise throw an exception */
     public final Tree<T> expand1() throws Ambiguous, ParseFailed {
@@ -125,6 +129,10 @@ public abstract class Forest<T> /*extends PrintableTree<Forest.MyBody<T>>*/ impl
     static class Ref<T> extends Forest<T> {
         private FastSet<Forest<T>> hp = new FastSet<Forest<T>>();
         public Ref() { }
+        public int toInt() {
+            if (hp.size()==1) return hp.iterator().next().toInt();
+            return super.toInt();
+        }
         public void merge(Forest p) { if (p!=this) hp.add(p, true); }
         public <B,C> void visit(Invokable<Forest.Body<T>,B,C> ivbc, B b, C c) {
             if (hp==null) return;
index a5d6f88..1d91f89 100644 (file)
@@ -308,39 +308,33 @@ class GSS {
                     Forest[] holder = new Forest[r.pos];
                     if (r.pos<=0) throw new Error("called wrong form of reduce()");
                     int pos = r.pos-1;
-                    Forest old = holder[pos];
-                    holder[pos] = n.pending();
-                    if (pos==0) {
-                        System.arraycopy(holder, 0, r.holder, 0, holder.length);
-                        Forest rex = null;
-                        if (r.pos==1)  rex = singularReductions.get(this, r);
-                        if (rex==null) {
-                            rex = r.rewrite(n.phase().getLocation());
-                            if (r.pos==1) singularReductions.put(this, r, rex);
-                        }
-                        n2.finish(r, rex, n.phase(), holder);
-                    } else {
-                        n2.reduce(r, pos-1, n.phase(), holder);
-                    }
-                    holder[pos] = old;
+                    n.reduce(r, pos, n.phase(), holder, n2);
                 }
             }
 
-            public void reduce(Position r, int pos, Phase target, Forest[] holder) {
+            public void reduce(Position r, int pos, Phase target, Forest[] holder) { reduce(r, pos, target, holder, null); }
+            public void reduce(Position r, int pos, Phase target, Forest[] holder, Node only) {
                 Forest old = holder[pos];
                 holder[pos] = this.pending();
                 if (pos==0) {
                     System.arraycopy(holder, 0, r.holder, 0, holder.length);
                     for(int i=0; i<r.pos; i++) if (r.holder[i]==null) throw new Error("realbad");
                     Forest rex = null;
-                    if (r.pos==1)  rex = singularReductions.get(this, r);
+
+                    // 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.
+                    if (r.pos==1)  rex = singularReductions.get(this.pending(), r);
                     if (rex==null) {
                         rex = r.rewrite(phase().getLocation());
-                        if (r.pos==1) singularReductions.put(this, r, rex);
+                        if (r.pos==1) singularReductions.put(this.pending(), r, rex);
                     }
-                    for(Node child : this.parents()) child.finish(r, rex, target, holder);
+                    if (only != null)  only.finish(r, rex, target, holder);
+                    else               for(Node child : this.parents()) child.finish(r, rex, target, holder);
                 } else {
-                    for(Node child : this.parents()) child.reduce(r, pos-1, target, holder);
+                    if (only != null)  only.reduce(r, pos-1, target, holder);
+                    else               for(Node child : this.parents()) child.reduce(r, pos-1, target, holder);
                 }
                 holder[pos] = old;
             }
index 0a97e61..4c14512 100644 (file)
@@ -9,7 +9,7 @@ header
   this is the body adam@megacz.com text
   You can visit {my website}->adam@megacz.com with a !hyperlink to it!
 
-  The following demonstrates verbatim stuff [Knu68] as
+  The following demonstrates verbatim stuff [Knu68], as
   well as a footnote ((like)) because are
   coool in an O(n^^3) way.