checkpoint
authoradam <adam@megacz.com>
Mon, 16 Jan 2006 00:33:08 +0000 (19:33 -0500)
committeradam <adam@megacz.com>
Mon, 16 Jan 2006 00:33:08 +0000 (19:33 -0500)
darcs-hash:20060116003308-5007d-9536dff44eacec9acbf8677d09716103ecb91f2f.gz

src/edu/berkeley/sbp/misc/MetaGrammar.java
tests/meta.g

index 3a55383..51c8d1a 100644 (file)
@@ -7,8 +7,6 @@ import java.io.*;
 
 public class MetaGrammar extends StringWalker {
 
-    boolean forceDrop = false;
-
     public static class Hack<T extends Input> extends Atom<T> {
         private final Atom<T> a;
         static final Topology leftright = CharRange.rightBrace.union(CharRange.leftBrace);
@@ -128,26 +126,13 @@ public class MetaGrammar extends StringWalker {
         else if (")".equals(head)) return SELF;
         else if ("psx".equals(head)) return ((PreSequence)walk(tree, 0)).buildSequence();
         else if ("nonTerminal".equals(head)) return getNonTerminal(string(tree.child(0)));
-        else if ("::=".equals(head)) {
-            forceDrop = false;
-            return nonTerminal(string(tree.child(0)), (Sequence[][])walk(tree, 1), false, false);
-        }
-        else if ("!::=".equals(head)) {
-            forceDrop = true;
-            Object ret = nonTerminal(string(tree.child(0)), (Sequence[][])walk(tree, 1), false, true);
-            forceDrop = false;
-            return ret;
-        }
+        else if ("::=".equals(head)) return nonTerminal(string(tree.child(0)), (Sequence[][])walk(tree, 1), false, false);
         else if ("(".equals(head)) return buildUnion((Sequence[][])walk(tree, 0));
         else if ("literal".equals(head)) { Element ret = string(string(tree.child(0))); dropAll.add(ret); return ret; }
         else if ("-".equals(head)) return new Range(walk(tree, 0).toString().charAt(0), walk(tree,1).toString().charAt(0));
         else if ("range".equals(head)) return new Range(walk(tree, 0).toString().charAt(0), walk(tree,0).toString().charAt(0));
         else if ("gram".equals(head)) return walk(tree, 0);
-        else if ("=>".equals(head)) {
-            PreSequence p = (PreSequence)walk(tree, 0);
-            p.tag = string(tree.child(1));
-            return p.buildSequence(null, false, "()".equals(p.tag));
-        }
+        else if ("=>".equals(head)) return ((PreSequence)walk(tree, 0)).buildSequence(null, false, string(tree.child(1)));
         else if ("[]".equals(head)) { PreSequence p = (PreSequence)walk(tree, 0); p.unwrap = true; return p; }
         else if ("psy".equals(head)) return (PreSequence)walk(tree, 0);
         else if ("->".equals(head)) { PreSequence p = (PreSequence)walk(tree, 0); p.noFollow = (Element)walk(tree, 1); return p; }
@@ -246,8 +231,12 @@ public class MetaGrammar extends StringWalker {
         }
         public Union    buildUnion() { return buildUnion("???"); }
         public boolean unwrap = false;
-        public Sequence buildSequence() { return buildSequence(null, false, forceDrop); }
+        public Sequence buildSequence() { return buildSequence(null, false, false); }
         public Sequence buildSequence(Union u) { return buildSequence(u, false, false); }
+        public Sequence buildSequence(Union u, boolean lame, String tag) {
+            this.tag = tag;
+            return buildSequence(u, lame, "()".equals(tag));
+        }
         public Sequence buildSequence(Union u, boolean lame, boolean dropAll) {
             if (u!=null) {
                 for(Sequence s : and) u.add(s);
index 349be33..5dafc7d 100644 (file)
@@ -2,54 +2,50 @@ s           ::=  Grammar ws                  => "gram"
 Grammar     ::=  NonTerminal +/ ws           => "grammar"
 NonTerminal ::=  word  ^"::=" RHS /ws
 
-w        ::= " " | "\n" | "\r"
-ws        ::=  w** => ()
-            |  w** "//" ~[\n]* "\n" ws => ()
-wp        ::=  w++
-
-RHS        ::=  (Conjuncts +/ (!ws "|" !ws)) +/ (!ws ">" !ws)
-
-Conjuncts  ::=  Sequence
-             |  Sequence ^"&"  e*/ws   /ws
-             |  Sequence ^"&~" e*/ws   /ws
-
-ps         ::= e*/ws                              => "ps"
-             | (e+/ws !ws)? ^"^" Quoted (!ws e+/ws)?
-psy        ::= ps
-             | ps !wp ^"/" !ws e
-psx        ::= psy                   => "psy"
-             | psy ^"->" e /ws
-Sequence   ::= Quoted => "qprod"
-             > psx => "psx"
-             | psx  "=>" ^"[]"         /ws
-             | psx ^"=>" ("()"|word|Quoted) /ws
-
-ec       ::= ~[\-\]\\]
-           | escaped
-
-Range    ::= ec          => "range"
-           | ec ^"-" ec
-
-e        ::=  word                          => "nonTerminal"
-           |  Quoted                        => "literal"
-           |    ^"()"
-           |    ^"{" Sequence "}"       /ws
-           |    ^"["  Range* "]"
-
-           |  e ^"++"                   /ws -> ~[/]
-           |  e ^"+"                    /ws -> ~[+]
-           |  e ^"++/" e                /ws        
-           |  e ^"+/"  e                /ws        
-           |  e ^"**"                   /ws -> ~[/]
-           |  e ^"*"                    /ws -> ~[*]
-           |  e ^"**/" e                /ws        
-           |  e ^"*/"  e                /ws        
-           |  ^"!" e                    /ws
-           |  e ^"?"                    /ws
-
-           |     "(" word         ^")"  /ws
-           >    ^"(" RHS  ")"           /ws
-           |    ^"~" e
+RHS         ::=  (Conjuncts +/ (!ws "|" !ws)) +/ (!ws ">" !ws)
+
+Conjuncts   ::=  Sequence
+              |  Sequence ^"&"  Elements  /ws
+              |  Sequence ^"&~" Elements  /ws
+Elements    ::=  e*/ws
+
+ps          ::= Elements                           => "ps"
+              | (e+/ws !ws)? ^"^" Quoted (!ws e+/ws)?
+psy         ::= ps
+              | ps !wp ^"/" !ws e
+psx         ::= psy                   => "psy"
+              | psy ^"->" e /ws
+Sequence    ::= Quoted => "qprod"
+              > psx => "psx"
+              | psx  "=>" ^"[]"              /ws
+              | psx ^"=>" ("()"|word|Quoted) /ws
+
+ec          ::= ~[\-\]\\]
+              | escaped
+
+Range       ::= ec          => "range"
+              | ec ^"-" ec
+
+e           ::=  word                          => "nonTerminal"
+              |  Quoted                        => "literal"
+              |    ^"()"
+              |    ^"{" Sequence "}"       /ws
+              |    ^"["  Range* "]"
+
+              |  e ^"++"                   /ws -> ~[/]
+              |  e ^"+"                    /ws -> ~[+]
+              |  e ^"++/" e                /ws        
+              |  e ^"+/"  e                /ws        
+              |  e ^"**"                   /ws -> ~[/]
+              |  e ^"*"                    /ws -> ~[*]
+              |  e ^"**/" e                /ws        
+              |  e ^"*/"  e                /ws        
+              |    ^"!"   e                /ws
+              |  e ^"?"                    /ws
+
+              |     "(" word         ^")"  /ws
+              >    ^"(" RHS  ")"           /ws
+              |    ^"~" e
 
 word     ::= [a-zA-Z0-9_]++
 Quoted   ::= "\"" ((~[\"\\] | escaped)+) "\""
@@ -59,3 +55,7 @@ escaped  ::= "\\n" => "\n"
            | "\\" ~[nr]
 
 
+w           ::= " " | "\n" | "\r"
+ws          ::=  w** => ()
+              |  w** "//" ~[\n]* "\n" ws => ()
+wp          ::=  w++