checkpoint
authoradam <adam@megacz.com>
Sun, 16 Jul 2006 06:42:11 +0000 (02:42 -0400)
committeradam <adam@megacz.com>
Sun, 16 Jul 2006 06:42:11 +0000 (02:42 -0400)
darcs-hash:20060716064211-5007d-9406e00f2d09782ae7c018719b4948026ceb707c.gz

COPYING [new file with mode: 0644]
TODO
src/edu/berkeley/sbp/Forest.java
src/edu/berkeley/sbp/misc/RegressionTests.java
src/edu/berkeley/sbp/tib/TibDoc.java
tests/tibdoc.g

diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..994c4d6
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,29 @@
+Copyright (c) 2006, Adam Megacz
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+  * Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+
+  * Neither the name of the University of California, Berkeley nor the
+    names of its contributors may be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR AND CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/TODO b/TODO
index 2cec777..78b4ecd 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,18 +1,16 @@
 _____________________________________________________________________________
 Immediately
 
 _____________________________________________________________________________
 Immediately
 
-- Migrate Demo.java -> MetaGrammar.java
-    - Figure out serialization
-
-- Clean up the prioritized-match garbage
- - evil problems with      (x y? z /ws)
-
-
-  - better ambiguity debugging tools / visualization
+  - evil problems with      (x y? z /ws)
   - ParseFailed, GSS, Walk, Parser, Sequence, Forest
   - copyright notices
   - documentation
 
   - ParseFailed, GSS, Walk, Parser, Sequence, Forest
   - copyright notices
   - documentation
 
+  - grammar highlighting?
+  - comment indentation vs block indentation?
+  - { and } in <pre>
+  - recursive { { foo } }
+
 ______________________________________________________________________________
 v1.1
 
 ______________________________________________________________________________
 v1.1
 
@@ -24,8 +22,6 @@ v1.1
       - RFC2822 (email message/headers)
   - clean up the whole Walk situation (?)
 
       - RFC2822 (email message/headers)
   - clean up the whole Walk situation (?)
 
-  - what if Tree<> could unwrap itself?
-
 
 ______________________________________________________________________________
 Soon
 
 ______________________________________________________________________________
 Soon
@@ -37,10 +33,6 @@ Soon
        - eliminated statically?
 
   - substring parsing for better error messages
        - eliminated statically?
 
   - substring parsing for better error messages
-  - "lift" cases:
-      - right now I can only lift the last child in a forest...  begs
-        the question of what the right representation for Forests is
-        if we need to be able to do lift operations on it.
 
   - Parameterized LR
   - "Regular Right Part" grammars (NP Chapman, etc)
 
   - Parameterized LR
   - "Regular Right Part" grammars (NP Chapman, etc)
index e53bfcb..7d872ad 100644 (file)
@@ -7,71 +7,66 @@ import java.util.*;
 import java.lang.reflect.*;
 
 /** an efficient representation of a collection of trees (Tomita's shared packed parse forest) */
 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.Body<T>>*/
-    implements IntegerMappable,
-               GraphViz.ToGraphViz {
+public abstract class Forest<T> implements GraphViz.ToGraphViz {
 
 
-    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 abstract Tree<T> expand1() throws Ambiguous;
 
     /** expand this forest into a set of trees */
     public void expand(HashSet<Tree<T>> ht) { expand(ht, new HashSet<Forest<T>>(), null); }
 
     /** assume that this forest contains exactly one tree and return it; otherwise throw an exception */
     public abstract Tree<T> expand1() throws Ambiguous;
 
     /** expand this forest into a set of trees */
     public void expand(HashSet<Tree<T>> ht) { expand(ht, new HashSet<Forest<T>>(), null); }
-    public abstract void expand(HashSet<Tree<T>> ht, HashSet<Forest<T>> ignore, Tree<T> bogus);
-    public abstract void gather(HashSet<Forest<T>> ignore);
-    public HashSet<Tree<T>> expand(boolean toss) {
-        HashSet<Tree<T>> ret = new HashSet<Tree<T>>();
-        expand(ret);
-        return ret;
-    }
 
 
-    public static <T> Forest<T> create(Input.Region loc, T tag, Forest<T>[] tokens, boolean unwrap) {
-        return new Body<T>(loc, tag, tokens, unwrap);
+    /** create a new forest node */
+    public static <T> Forest<T> create(Input.Region loc, T head, Forest<T>[] children, boolean unwrap) {
+        return new Body<T>(loc, head, children, unwrap);
     }
     }
+
+    // Package-Private //////////////////////////////////////////////////////////////////////////////
+
+    abstract void expand(HashSet<Tree<T>> ht, HashSet<Forest<T>> ignore, Tree<T> bogus);
+    abstract void gather(HashSet<Forest<T>> ignore);
+
     public abstract void edges(GraphViz.Node n);
     public boolean ambiguous() { return false; }
 
     // Body //////////////////////////////////////////////////////////////////////////////
 
     public abstract void edges(GraphViz.Node n);
     public boolean ambiguous() { return false; }
 
     // Body //////////////////////////////////////////////////////////////////////////////
 
-    public /*protected*/ static class Body<T> extends Forest<T> /* extends PrintableTree<Forest<T>> implements */ {
+    private static class Body<T> extends Forest<T> /* extends PrintableTree<Forest<T>> implements */ {
 
         private final Input.Region      location;
 
         private final Input.Region      location;
-        private final T                 tag;
-        private final Forest<T>[]       tokens;
+        private final T                 head;
+        private final Forest<T>[]       children;
         private final boolean           unwrap;
 
         private final boolean           unwrap;
 
-        private Body(Input.Region loc, T tag, Forest<T>[] tokens, boolean unwrap) {
+        private Body(Input.Region loc, T head, Forest<T>[] children, boolean unwrap) {
             this.location = loc;
             this.location = loc;
-            this.tag = tag;
-            this.tokens = tokens==null ? emptyForestArray : new Forest[tokens.length];
-            if (tokens != null) System.arraycopy(tokens, 0, this.tokens, 0, tokens.length);
-            if (tokens != null) for(int i=0; i<tokens.length; i++) if (tokens[i]==null) throw new Error(i+"");
+            this.head = head;
+            this.children = children==null ? emptyForestArray : new Forest[children.length];
+            if (children != null) System.arraycopy(children, 0, this.children, 0, children.length);
+            if (children != null) for(int i=0; i<children.length; i++) if (children[i]==null) throw new Error(i+"");
             this.unwrap = unwrap;
         }
 
         public Tree<T> expand1() throws Ambiguous {
             this.unwrap = unwrap;
         }
 
         public Tree<T> expand1() throws Ambiguous {
-            Tree<T>[] ret = new Tree[tokens.length];
-            for(int i=0; i<tokens.length; i++)
-                ret[i] = tokens[i].expand1();
-            return new Tree<T>(location, tag, ret, unwrap);
+            Tree<T>[] ret = new Tree[children.length];
+            for(int i=0; i<children.length; i++)
+                ret[i] = children[i].expand1();
+            return new Tree<T>(location, head, ret, unwrap);
         }
         public void gather(HashSet<Forest<T>> hf) {
             hf.add(this);
         }
         public void gather(HashSet<Forest<T>> hf) {
             hf.add(this);
-            for(Forest<T> f : tokens) f.gather(hf);
+            for(Forest<T> f : children) f.gather(hf);
         }
         public void expand(HashSet<Tree<T>> ht, HashSet<Forest<T>> ignore, Tree<T> bogus) {
             if (ignore.contains(this)) { ht.add(bogus); return; }
         }
         public void expand(HashSet<Tree<T>> ht, HashSet<Forest<T>> ignore, Tree<T> bogus) {
             if (ignore.contains(this)) { ht.add(bogus); return; }
-            expand(0, new Tree[tokens.length], ht, ignore, bogus);
+            expand(0, new Tree[children.length], ht, ignore, bogus);
         }
         public void expand(final int i, Tree<T>[] ta, HashSet<Tree<T>> ht, HashSet<Forest<T>> ignore, Tree<T> bogus) {
         }
         public void expand(final int i, Tree<T>[] ta, HashSet<Tree<T>> ht, HashSet<Forest<T>> ignore, Tree<T> bogus) {
-            if (i==tokens.length) {
-                ht.add(new Tree<T>(location, tag, ta, unwrap));
+            if (i==children.length) {
+                ht.add(new Tree<T>(location, head, ta, unwrap));
             } else {
                 HashSet<Tree<T>> ht2 = new HashSet<Tree<T>>();
             } else {
                 HashSet<Tree<T>> ht2 = new HashSet<Tree<T>>();
-                tokens[i].expand(ht2, ignore, bogus);
+                children[i].expand(ht2, ignore, bogus);
                 for(Tree<T> tc : ht2) {
                     ta[i] = tc;
                     expand(i+1, ta, ht, ignore, bogus);
                 for(Tree<T> tc : ht2) {
                     ta[i] = tc;
                     expand(i+1, ta, ht, ignore, bogus);
@@ -96,16 +91,16 @@ public abstract class Forest<T> /*extends PrintableTree<Forest.Body<T>>*/
         public void edges(GraphViz.Node n) {
             if (edges) return;
             edges = true;
         public void edges(GraphViz.Node n) {
             if (edges) return;
             edges = true;
-            for(int i=0; i<tokens.length; i++) {
-                if (i==tokens.length-1 && unwrap && !tokens[i].ambiguous()) {
-                    tokens[i].edges(n);
+            for(int i=0; i<children.length; i++) {
+                if (i==children.length-1 && unwrap && !children[i].ambiguous()) {
+                    children[i].edges(n);
                 } else {
                 } else {
-                    n.edge(tokens[i], null);
+                    n.edge(children[i], null);
                 }
             }
         }
 
                 }
             }
         }
 
-        protected String  headToString()         { return tag==null?null:tag.toString(); }
+        protected String  headToString()         { return head==null?null:head.toString(); }
         protected String  headToJava()           { return "null"; }
         protected String  left()                 { return "{"; }
         protected String  right()                { return "}"; }
         protected String  headToJava()           { return "null"; }
         protected String  left()                 { return "{"; }
         protected String  right()                { return "}"; }
@@ -163,11 +158,12 @@ public abstract class Forest<T> /*extends PrintableTree<Forest.Body<T>>*/
         }
 
         // GraphViz, ToInt //////////////////////////////////////////////////////////////////////////////
         }
 
         // GraphViz, ToInt //////////////////////////////////////////////////////////////////////////////
-
+        /*
         public int toInt() {
             if (hp.size()==1) return hp.iterator().next().toInt();
             return super.toInt();
         }
         public int toInt() {
             if (hp.size()==1) return hp.iterator().next().toInt();
             return super.toInt();
         }
+        */
         public boolean isTransparent() { return hp.size()==1; }
         public boolean isHidden() { return hp.size()==0; }
         public void edges(GraphViz.Node n) {
         public boolean isTransparent() { return hp.size()==1; }
         public boolean isHidden() { return hp.size()==0; }
         public void edges(GraphViz.Node n) {
index d870ae2..d2443ad 100644 (file)
@@ -154,7 +154,10 @@ public class RegressionTests {
                 p.close();
                 System.out.println(parser);
             }
                 p.close();
                 System.out.println(parser);
             }
-            Collection<Tree<String>> results = res==null ? new HashSet<Tree<String>>() : res.expand(false);
+
+            HashSet<Tree<String>> results = new HashSet<Tree<String>>();
+            if (res != null) res.expand(results);
+
             System.out.print("\r");
             if (results == null || (results.size() == 0 && (output!=null && output.length > 0))) {
                 System.out.print("\033[31m");
             System.out.print("\r");
             if (results == null || (results.size() == 0 && (output!=null && output.length > 0))) {
                 System.out.print("\033[31m");
index 2b65690..ea996ac 100644 (file)
@@ -409,12 +409,14 @@ toContex ll = prefix ++ (concatMap tl ll) ++ suffix
         }
 
         public static @bind.as("Citation") Object cite(Object o) { return new Chars("*cite*"); }
         }
 
         public static @bind.as("Citation") Object cite(Object o) { return new Chars("*cite*"); }
-        public static @bind.as("Symbol") Object sym(Object o) { return null; }
+        public static @bind.as("Symbol") Object sym(String s) { return new Chars(s); }
 
 
-        public static abstract class List extends Text {
-            public @bind.arg Text[][] points;
+        public static abstract class List extends Paragraph {
+            public @bind.arg Text[] preface;
+            public @bind.arg Text[][]  points;
             public abstract String tag();
             public void toHTML(ToHTML.HTML sb) {
             public abstract String tag();
             public void toHTML(ToHTML.HTML sb) {
+                sb.append(preface);
                 sb.openTag(tag());
                 for(Text[] t : points)
                     sb.tag("li", t);
                 sb.openTag(tag());
                 for(Text[] t : points)
                     sb.tag("li", t);
index f851d98..b3b107e 100644 (file)
@@ -74,9 +74,8 @@ num          = [0-9]++
 
 Paragraph   = { Blockquote:: "\"\" "    text }
             > HR::         { "---" "-"*      }
 
 Paragraph   = { Blockquote:: "\"\" "    text }
             > HR::         { "---" "-"*      }
-            > P::          { UL:: uli+/ws }
-            > P::          { OL:: oli+/ws }
-            > P::          { text            }
+            >         { OL:: (text &~ (text! ws! {oli}+)) ws! {oli}+  }
+            > P::          { text          }
 
 onums        = nums (". "|") ")!
 any          = ~[]*
 
 onums        = nums (". "|") ")!
 any          = ~[]*
@@ -89,8 +88,6 @@ text         = Item
 Item*/ws     =
                blockquote
 //             > ^"#" ws! { ~[]* }
 Item*/ws     =
                blockquote
 //             > ^"#" ws! { ~[]* }
-             > { UL:: uli+/ws }           
-             | { OL:: oli+/ws }           
              > Verbatim
              > InlineGrammar
              > link                       
              > Verbatim
              > InlineGrammar
              > link                       
@@ -143,6 +140,7 @@ glyph        = euro::     "(e)"
 
 command      = "\\" [a-z]++
 
 
 command      = "\\" [a-z]++
 
+
 // URLs //////////////////////////////////////////////////////////////////////////////
 
 // interesting opportunity to show off boolean grammars here: define other
 // URLs //////////////////////////////////////////////////////////////////////////////
 
 // interesting opportunity to show off boolean grammars here: define other
@@ -165,7 +163,7 @@ url          = Mailto:: "mailto" ":"   email -> ~urlv
                   port:(":" nums)?
                   path:("/" urlpath)?
                   ref:("#" urlpath)?
                   port:(":" nums)?
                   path:("/" urlpath)?
                   ref:("#" urlpath)?
-//                     -> ~(urlv|[\#])
+                     -> ~(urlv|[\#])
 url_login    = Login:: username:username password:(":" password) "@"
 method       = [+\-.a-z0-9]+
 domain       = (part +/ ".") -> ~"."
 url_login    = Login:: username:username password:(":" password) "@"
 method       = [+\-.a-z0-9]+
 domain       = (part +/ ".") -> ~"."