preliminary support for serialization of parse tables
authoradam <adam@megacz.com>
Mon, 9 Jun 2008 17:53:45 +0000 (13:53 -0400)
committeradam <adam@megacz.com>
Mon, 9 Jun 2008 17:53:45 +0000 (13:53 -0400)
darcs-hash:20080609175345-5007d-9c0cea946a51de13b9f1d073bbf9d146273d1aeb.gz

src/edu/berkeley/sbp/Sequence.java
src/edu/berkeley/sbp/misc/RegressionTests.java

index 430f298..d0c3dfd 100644 (file)
@@ -10,9 +10,9 @@ import java.lang.reflect.*;
 import java.lang.ref.*;
 
 /** <font color=green>juxtaposition; zero or more adjacent Elements; can specify a rewriting</font> */
-public abstract class Sequence implements Iterable<Element>, SequenceOrElement {
+public abstract class Sequence implements Iterable<Element>, SequenceOrElement, Serializable {
 
-    protected final Element[] elements;
+    protected transient final Element[] elements;
 
     boolean needed_or_hated = false;
     boolean in_a_union = false;
@@ -26,7 +26,7 @@ public abstract class Sequence implements Iterable<Element>, SequenceOrElement {
 
     final Position firstp;
 
-    Atom follow = null;
+    transient Atom follow = null;
 
     private static int global_sernum = 0;
     private int sernum = global_sernum++;
@@ -137,7 +137,7 @@ public abstract class Sequence implements Iterable<Element>, SequenceOrElement {
     static abstract class Pos implements IntegerMappable, Comparable<Pos>, Serializable {
 
         public int ord = -1;
-        private transient Sequence owner;
+        private Sequence owner;
 
         public int ord()     { return ord; }
 
@@ -223,8 +223,12 @@ public abstract class Sequence implements Iterable<Element>, SequenceOrElement {
         public final <T> Forest<T> rewrite(Input.Region loc) {
             if (isFirst()) return owner().epsilonForm(loc);
             for(int i=0; i<pos; i++) if (holder[i]==null) throw new Error("realbad " + i);
-            for(int i=pos; i<owner().elements.length; i++) {
-                if (holder[i]==null) holder[i] = ((Union)owner().elements[i]).epsilonForm(loc);
+            Position p = this;
+            for(int i=pos; p!=null && p.next()!=null; p=p.next(), i++) {
+                if (holder[i]==null)
+                    holder[i] = owner().elements==null
+                        ? new Forest.Many() /* FIXME */
+                        : ((Union)owner().elements[i]).epsilonForm(loc);
                 if (holder[i]==null) throw new Error("bad");
             }
             return owner().postReduce(loc, holder, this);
@@ -281,6 +285,7 @@ public abstract class Sequence implements Iterable<Element>, SequenceOrElement {
         public <T> Forest<T> postReduce(Input.Region loc, Forest<T>[] args, Position p) { return args[idx]; }
         Sequence _clone() { return new Singleton(elements,idx); }
         Forest epsilonForm(Input.Region loc) {
+            if (elements==null) return new Forest.Many(); /* FIXME */
             return ((Union)elements[idx]).epsilonForm(loc);
         }
     }
index d85630e..dfe30b6 100644 (file)
@@ -43,18 +43,22 @@ public class RegressionTests {
                 s = s2;
             }
 
+            CharParser cp;
+            Tree<String> res;
+
             InputStream metaGrammarStream =
                 s[0] == null
                 ? RegressionTests.class.getClassLoader().getResourceAsStream("edu/berkeley/sbp/meta/meta.g")
                 : new FileInputStream(s[0]);
-            Tree<String> res = new CharParser(GrammarAST.getMetaGrammar()).parse(metaGrammarStream).expand1();
+            res = new CharParser(GrammarAST.getMetaGrammar()).parse(metaGrammarStream).expand1();
             Union meta = GrammarAST.buildFromAST(res, "s", resolver);
-            CharParser cp = new CharParser(meta);
+            cp = new CharParser(meta);
 
             System.err.println("serializing grammar to grammar.ser...");
             ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("grammar.ser"));
             oos.writeObject(cp);
             oos.close();
+
             System.err.println("deserializing grammar from grammar.ser...");
             ObjectInputStream ois = new ObjectInputStream(new FileInputStream("grammar.ser"));
             cp = (CharParser)ois.readObject();
@@ -62,9 +66,6 @@ public class RegressionTests {
 
             System.err.println("parsing " + s[1]);
             res = new CharParser(meta).parse(new FileInputStream(s[1])).expand1();
-            
-            // uncomment this when I get serialization working
-            //res = cp.parse(new FileInputStream(s[1])).expand1();
 
             Union testcasegrammar = GrammarAST.buildFromAST(res, "s", resolver);
             if (testcasegrammar==null) return;