removed illegal use of double-star
authoradam <adam@megacz.com>
Mon, 2 Jan 2006 02:47:50 +0000 (21:47 -0500)
committeradam <adam@megacz.com>
Mon, 2 Jan 2006 02:47:50 +0000 (21:47 -0500)
darcs-hash:20060102024750-5007d-24a3c776616cb59c9a5d4188915629d261702f7d.gz

src/edu/berkeley/sbp/Repeat.java
src/edu/berkeley/sbp/Sequence.java
src/edu/berkeley/sbp/Union.java
src/edu/berkeley/sbp/Walk.java
src/edu/berkeley/sbp/misc/MetaGrammar.java
tests/meta.g

index 35f3477..48ac386 100644 (file)
@@ -51,8 +51,12 @@ public class Repeat extends Union {
 
     static class MaximalSequence extends Sequence.Singleton {
         private final Element e;
-        public String toString() { return e+"@";}
-        public MaximalSequence(Element e) { super(e, null, null); this.e = e; }
+        public String toString() { return e+"@"; }
+        public Topology noFollow() { return e.toAtom(); }
+        public MaximalSequence(Element e) {
+            super(e, null, null);
+            this.e = e;
+        }
     }
     static class Maximal extends Union {
         public Maximal(final Element e) {
index 9586f72..a5149f2 100644 (file)
@@ -35,8 +35,11 @@ public abstract class Sequence extends Element implements Iterable<Element> {
 
     ////////////////////////////////////////////////////////////////////////////////
 
+    public Topology noFollow() { return null; }
+
     Topology toAtom() {
-        if (elements.length!=1) return null;
+        if (elements.length>1) throw new RuntimeException("cannot invoke toAtom() on a Sequence with " + elements.length + " elements: " + this);
+        if (elements.length==0) return null;
         return elements[0].toAtom();
     }
 
index 7274dae..a7a7630 100644 (file)
@@ -19,10 +19,11 @@ public class Union extends Element implements Iterable<Sequence> {
     void reachable(HashSet<Sequence.Position> h) { for(Sequence s : alternatives) s.reachable(h); }
 
     Topology toAtom() {
-        if (alternatives.size()==0) return null;
+        if (alternatives.size()==0) throw new RuntimeException("cannot build an Atom from a Union with no productions");
         Topology ret = null;
         for(Sequence s : this) {
             Topology a = s.toAtom();
+            if (a==null) continue;
             if (ret==null) ret = a.dup();
             else           ret.add(a.dup());
         }
index abbffd7..cfd9c31 100644 (file)
@@ -166,7 +166,12 @@ abstract class Walk<T> {
 
             if (e instanceof Repeat.MaximalSequence || e instanceof Repeat.Maximal)
                 cs.remove(new Last<Tok>(cs.fresh(), c).walk(e));
-
+            /*
+            if (e instanceof Sequence) {
+                Sequence s = (Sequence)e;
+                if (s.noFollow() != null) cs.remove(s.noFollow());
+            }
+            */
             if (c != null && e==me) {
                 c.follow.put(e, cs.dup());
                 c.eof.put(e, eof);
index 0571a98..861b5a9 100644 (file)
@@ -298,6 +298,8 @@ public class MetaGrammar extends StringWalker {
 
 
 
+
+
         // DO NOT EDIT STUFF BELOW: IT IS AUTOMATICALLY GENERATED
 new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, "grammar", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "s", new Tree[] { })}),
@@ -318,7 +320,15 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, "m", new Tree[] { })})})})})}),
         new Tree(null, "!::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "**", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { })})})})})})})})}),
+        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "**", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { })})})})})}),
+        new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
+        new Tree(null, "s", new Tree[] { })})}),
+        new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "/", new Tree[] { }),
+        new Tree(null, "/", new Tree[] { })})}),
+        new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "*", new Tree[] { new Tree(null, "[~", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "range", new Tree[] { new Tree(null, "\n", new Tree[] { })})})})})})})})})}),
+        new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\n", new Tree[] { })})}),
+        new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
+        new Tree(null, "s", new Tree[] { })})})})})})})}),
         new Tree(null, "!::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "p", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "++", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { })})})})})})})})}),
@@ -737,10 +747,6 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})})})})})}),
         new Tree(null, "!::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "qprod", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, " ", new Tree[] { })})}),
-        new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "/", new Tree[] { }),
-        new Tree(null, "/", new Tree[] { })})}),
-        new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "*", new Tree[] { new Tree(null, "[~", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "range", new Tree[] { new Tree(null, "\n", new Tree[] { })})})})})})})})})}),
-        new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\n", new Tree[] { })})})})}),
         new Tree(null, "qprod", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\n", new Tree[] { })})}),
         new Tree(null, "qprod", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\r", new Tree[] { })})})})})}),
         new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
@@ -838,3 +844,5 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
 
 
 
+
+
index 11fee67..ed87f5c 100644 (file)
@@ -1,5 +1,5 @@
 s         ::=  ws grammar ws                  => "gram"
-ws       !::=  w**
+ws       !::=  w** | ws "//" ([~\n]*) "\n" ws
 wp       !::=  w++
 grammar   ::=  r +/ ws                        => "grammar"
 
@@ -45,7 +45,6 @@ e        ::=  word                          => "nonTerminal"
            |     "(" word         ^")"  /ws
            >    ^"(" alternatives  ")"  /ws
 w       !::= " "
-           | "//" ([~\n]*) "\n"
            | "\n"
            | "\r"
 word     ::= [a-zA-Z0-9_]++