From: adam Date: Sun, 16 Jul 2006 06:42:11 +0000 (-0400) Subject: checkpoint X-Git-Tag: tag_for_25-Mar~131 X-Git-Url: http://git.megacz.com/?p=sbp.git;a=commitdiff_plain;h=4b5b35b9dbcf29da663c72d12aaf6ac3d2083d27 checkpoint darcs-hash:20060716064211-5007d-9406e00f2d09782ae7c018719b4948026ceb707c.gz --- diff --git a/COPYING b/COPYING new file mode 100644 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 --- a/TODO +++ b/TODO @@ -1,18 +1,16 @@ _____________________________________________________________________________ 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 + - grammar highlighting? + - comment indentation vs block indentation? + - { and } in
+  - recursive { { foo } }
+
 ______________________________________________________________________________
 v1.1
 
@@ -24,8 +22,6 @@ v1.1
       - RFC2822 (email message/headers)
   - clean up the whole Walk situation (?)
 
-  - what if Tree<> could unwrap itself?
-
 
 ______________________________________________________________________________
 Soon
@@ -37,10 +33,6 @@ Soon
        - 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)
diff --git a/src/edu/berkeley/sbp/Forest.java b/src/edu/berkeley/sbp/Forest.java
index e53bfcb..7d872ad 100644
--- a/src/edu/berkeley/sbp/Forest.java
+++ b/src/edu/berkeley/sbp/Forest.java
@@ -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) */
-public abstract class Forest /*extends PrintableTree>*/
-    implements IntegerMappable,
-               GraphViz.ToGraphViz {
+public abstract class Forest 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 expand1() throws Ambiguous;
 
     /** expand this forest into a set of trees */
     public void expand(HashSet> ht) { expand(ht, new HashSet>(), null); }
-    public abstract void expand(HashSet> ht, HashSet> ignore, Tree bogus);
-    public abstract void gather(HashSet> ignore);
-    public HashSet> expand(boolean toss) {
-        HashSet> ret = new HashSet>();
-        expand(ret);
-        return ret;
-    }
 
-    public static  Forest create(Input.Region loc, T tag, Forest[] tokens, boolean unwrap) {
-        return new Body(loc, tag, tokens, unwrap);
+    /** create a new forest node */
+    public static  Forest create(Input.Region loc, T head, Forest[] children, boolean unwrap) {
+        return new Body(loc, head, children, unwrap);
     }
+
+    // Package-Private //////////////////////////////////////////////////////////////////////////////
+
+    abstract void expand(HashSet> ht, HashSet> ignore, Tree bogus);
+    abstract void gather(HashSet> ignore);
+
     public abstract void edges(GraphViz.Node n);
     public boolean ambiguous() { return false; }
 
     // Body //////////////////////////////////////////////////////////////////////////////
 
-    public /*protected*/ static class Body extends Forest /* extends PrintableTree> implements */ {
+    private static class Body extends Forest /* extends PrintableTree> implements */ {
 
         private final Input.Region      location;
-        private final T                 tag;
-        private final Forest[]       tokens;
+        private final T                 head;
+        private final Forest[]       children;
         private final boolean           unwrap;
 
-        private Body(Input.Region loc, T tag, Forest[] tokens, boolean unwrap) {
+        private Body(Input.Region loc, T head, Forest[] children, boolean unwrap) {
             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 expand1() throws Ambiguous {
-            Tree[] ret = new Tree[tokens.length];
-            for(int i=0; i(location, tag, ret, unwrap);
+            Tree[] ret = new Tree[children.length];
+            for(int i=0; i(location, head, ret, unwrap);
         }
         public void gather(HashSet> hf) {
             hf.add(this);
-            for(Forest f : tokens) f.gather(hf);
+            for(Forest f : children) f.gather(hf);
         }
         public void expand(HashSet> ht, HashSet> ignore, Tree 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[] ta, HashSet> ht, HashSet> ignore, Tree bogus) {
-            if (i==tokens.length) {
-                ht.add(new Tree(location, tag, ta, unwrap));
+            if (i==children.length) {
+                ht.add(new Tree(location, head, ta, unwrap));
             } else {
                 HashSet> ht2 = new HashSet>();
-                tokens[i].expand(ht2, ignore, bogus);
+                children[i].expand(ht2, ignore, bogus);
                 for(Tree tc : ht2) {
                     ta[i] = tc;
                     expand(i+1, ta, ht, ignore, bogus);
@@ -96,16 +91,16 @@ public abstract class Forest /*extends PrintableTree>*/
         public void edges(GraphViz.Node n) {
             if (edges) return;
             edges = true;
-            for(int i=0; i /*extends PrintableTree>*/
         }
 
         // GraphViz, 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) {
diff --git a/src/edu/berkeley/sbp/misc/RegressionTests.java b/src/edu/berkeley/sbp/misc/RegressionTests.java
index d870ae2..d2443ad 100644
--- a/src/edu/berkeley/sbp/misc/RegressionTests.java
+++ b/src/edu/berkeley/sbp/misc/RegressionTests.java
@@ -154,7 +154,10 @@ public class RegressionTests {
                 p.close();
                 System.out.println(parser);
             }
-            Collection> results = res==null ? new HashSet>() : res.expand(false);
+
+            HashSet> results = new HashSet>();
+            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");
diff --git a/src/edu/berkeley/sbp/tib/TibDoc.java b/src/edu/berkeley/sbp/tib/TibDoc.java
index 2b65690..ea996ac 100644
--- a/src/edu/berkeley/sbp/tib/TibDoc.java
+++ b/src/edu/berkeley/sbp/tib/TibDoc.java
@@ -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("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) {
+                sb.append(preface);
                 sb.openTag(tag());
                 for(Text[] t : points)
                     sb.tag("li", t);
diff --git a/tests/tibdoc.g b/tests/tibdoc.g
index f851d98..b3b107e 100644
--- a/tests/tibdoc.g
+++ b/tests/tibdoc.g
@@ -74,9 +74,8 @@ num          = [0-9]++
 
 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          = ~[]*
@@ -89,8 +88,6 @@ text         = Item
 Item*/ws     =
                blockquote
 //             > ^"#" ws! { ~[]* }
-             > { UL:: uli+/ws }           
-             | { OL:: oli+/ws }           
              > Verbatim
              > InlineGrammar
              > link                       
@@ -143,6 +140,7 @@ glyph        = euro::     "(e)"
 
 command      = "\\" [a-z]++
 
+
 // 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)?
-//                     -> ~(urlv|[\#])
+                     -> ~(urlv|[\#])
 url_login    = Login:: username:username password:(":" password) "@"
 method       = [+\-.a-z0-9]+
 domain       = (part +/ ".") -> ~"."