checkpoint
[sbp.git] / src / edu / berkeley / sbp / misc / MetaGrammar.java
index e7aa685..e9c4413 100644 (file)
 package edu.berkeley.sbp.misc;
 import edu.berkeley.sbp.util.*;
 import edu.berkeley.sbp.*;
+import edu.berkeley.sbp.chr.*;
 import java.util.*;
 import java.io.*;
 
-public class MetaGrammar extends ReflectiveWalker {
+public class MetaGrammar extends StringWalker {
 
-    public static Union make() throws Exception {
-        return ((MetaGrammar)new MetaGrammar().walk(meta)).done();
+    public static Union make() throws Exception { return make(MetaGrammarTree.meta, "s"); }
+    public static Union make(Tree<String> tree, String nt) throws Exception {
+        Meta.MetaGrammarFile mgf = new Meta().new MetaGrammarFile(tree);
+        BuildContext bc = new BuildContext(mgf);
+        return mgf.get(nt).build(bc);
     }
-    public String toString() {
-        StringBuffer ret = new StringBuffer();
-        for(Union u : nt.values()) u.toString(ret);
-        return ret.toString();
-    }
-
-    private static HashSet<Element> dropAll = new HashSet<Element>();
-
-    // Statics //////////////////////////////////////////////////////////////////////////////
-
-    private static final Union SELF = new Union("()");
 
     ////////////////////////////////////////////////////////////////////////////////
 
-    private Union g;
-    private HashMap<String,Union> nt;
-    private int anon = 0;
-    private String startSymbol;
-    private boolean strings;
+    private static Element  set(Range.Set r) { return CharRange.set(r); }
+    private static Element  string(String s) { return CharRange.string(s); }
+    /*private*/ static Atom infer(Element e)  { return infer((Topology<Character>)Atom.toAtom(e)); }
+    /*private*/ static Atom infer(Topology<Character> t) { return new CharRange(new CharTopology(t)); }
 
-    private Element  set(Range.Set r) { if (strings) throw new Error(); return CharToken.set(r); }
-    private Element  string(String s) { return strings ? StringToken.string(s) : CharToken.string(s); }
-    private Atom     leftBrace()      { return strings ? StringToken.leftBrace : CharToken.leftBrace; }
-    private Atom     rightBrace()     { return strings ? StringToken.rightBrace : CharToken.rightBrace; }
+    private MetaGrammar() { }
 
-    public MetaGrammar() { this("s", false); }
-    public MetaGrammar(String s) { this(s, false); }
-    public MetaGrammar(String s, boolean strings) { this.strings = strings; done(s); }
-    public Union done() { return done("s"); }
-    public Union done(String str) {
-        Union ret = g;
-        g = new Union(str);
-        startSymbol = str;
-        nt = new HashMap<String,Union>();
-        dropAll = new HashSet<Element>();
-        nt.put(str, g);
+    public static String string(Iterable<Tree<String>> children) {
+        String ret = "";
+        for(Tree<String> t : children) ret += string(t);
         return ret;
     }
-
-
-    // MetaGrammar //////////////////////////////////////////////////////////////////////////////
-
-    public PreSequence _amp_(PreSequence p, Object[] o)        { return p.and(new PreSequence(o, null).buildSequence(null, true, false)); }
-    public PreSequence _amp__tilde_(PreSequence p, Object[] o) { return p.not(new PreSequence(o, null).buildSequence(null, true, false)); }
-    public Element     epsilon(Object o, Object b)                                    { return Union.epsilon; }
-    public Object      _leftparen__rightparen_(Object o)                              { return Union.epsilon; }
-    public Element     _rightparen_(Object e)                                         { return SELF; }
-    public Union       nonTerminal(String s)                                          { return nonTerminal(s, null, false, false); }
-    public Union       _colon__colon__equals_(String s, PreSequence[][] p)            { return nonTerminal(s, p, false, false); }
-    public Union       _bang__colon__colon__equals_(String s, PreSequence[][] p)      { return nonTerminal(s, p, false, true); }
-    public Object      _leftparen_(PreSequence[][] p)                                 { return nonTerminal("anon"+(anon++), p, false, false); }
-    public Union       nonTerminal(String str, PreSequence[][] s, boolean synthetic, boolean dropAll) {
-        Union n = str.equals(startSymbol) ? g : nt.get(str);
-        if (n == null) nt.put(str, n = new Union(str, synthetic));
-        if (dropAll) this.dropAll.add(n);
-        if (s==null) return n;
-        HashSet<Sequence> seqs = new HashSet<Sequence>();
-        for(int i=0; i<s.length; i++) {
-            if (s[i]==null) continue;
-            HashSet<Sequence> temp = new HashSet<Sequence>();
-            for(PreSequence pre : s[i]) {
-                pre.not.addAll(seqs);
-                Sequence seq = pre.buildSequence(n, false, dropAll);
-                temp.add(seq);
-                n.add(seq);
-            }
-            seqs.addAll(temp);
-        }
-        return n;
-    }
-
-    public Object   _backslash__leftbrace_(String s)      { return SELF; }
-    public Object   _leftbrace_(PreSequence p) {
-        return nonTerminal("braced"+(anon++),
-                           new PreSequence[][] {
-                               new PreSequence[] {
-                                   new PreSequence(new Element[] { leftBrace(),
-                                                                   p.buildUnion(),
-                                                                   rightBrace()
-                                   })
-                               }
-                           },
-                           false,
-                           false);
-    }
-
-    public PreSequence _equals__greater_(PreSequence p, String tag) { p.tag = tag; return p; }
-
-    public PreSequence ps(Object[] o) { return new PreSequence(o); }
-    public PreSequence ps2(Object[] o1, String s, Object[] o2) {
-        if (o1==null) o1 = new Object[0];
-        if (o2==null) o2 = new Object[0];
-        Object[] o3 = new Object[o1.length + o2.length + 1];
-        System.arraycopy(o1, 0, o3, 0, o1.length);
-        o3[o1.length] = string(s);
-        System.arraycopy(o2, 0, o3, o1.length+1, o2.length);
-        PreSequence ret = new PreSequence(o3, s);
-        ret.drops[o1.length] = o3.length>1;
+    public static String string(Tree<String> tree) {
+        String ret = "";
+        if (tree.head()!=null) ret += tree.head();
+        ret += string(tree.children());
         return ret;
     }
-    public PreSequence _slash_(PreSequence p, Object sep) { return p.sparse(sep); }
 
-    public Object      _star_(Element r)                    { return Repeat.many0(r); }
-    public Object   _plus_(final Element r)                 { return Repeat.many1(r); }
-    public Object _plus__slash_(final Element r, Element s) { return Repeat.many1(r, s); }
-    public Object _star__slash_(final Element r, Element s) { return Repeat.many0(r, s); }
-    public Object _star__star_(final Element r)             { return Repeat.maximal(Repeat.many0(r)); }
-    public Object _plus__plus_(final Element r)             { return Repeat.maximal(Repeat.many1(r)); }
-    public Element _question_(final Element r)              { return Repeat.maybe(r); }
-
-    public Object walk(Tree<String> tree) {
-        String head = tree.head();
-        if (tree.numChildren()==0) return super.walk(tree);
-        if      ("\\n".equals(head)) return new Character('\n');
-        else if ("\\r".equals(head)) return new Character('\r');
-        else if ("grammar".equals(head)) { for(Tree<String> t : tree.children()) walk(t); return this; }
-        else return super.walk(tree);
+    public static class BuildContext extends HashMap<String,Union> {
+        private final Meta.MetaGrammarFile mgf;
+        public Meta.NonTerminal currentNonTerminal;
+        public BuildContext(Meta.MetaGrammarFile mgf) { this.mgf = mgf; }
+        public Union build(String s) {
+            Union ret = get(s);
+            if (ret != null) return ret;
+            Meta.NonTerminal mnt = mgf.get(s);
+            if (mnt==null) throw new Error("undeclared nonterminal \""+s+"\"");
+            return mnt.build(this);
+        }
     }
 
-    public Object gram(Object o, Object g, Object o2) { return g; }
-    public Element    literal(String s) { Element ret = string(s); dropAll.add(ret); return ret; }
-    public Range     _minus_(char a, char b) { return new Range(a, b); }
-    public Range     range(char a)         { return new Range(a, a); }
-    public Element   _leftbracket_       (Range[] rr) { return ranges(true, rr); }
-    public Element   _leftbracket__tilde_(Range[] rr) { return ranges(false,  rr); }
-    public Element   ranges(boolean positive, Range[] rr) {
-        Range.Set ret = positive ? new Range.Set() : new Range.Set(new Range(true, true));
-        if (rr != null)
-            for(Range r : rr)
-                if (positive) ret.add(r);
-                else          ret.remove(r);
-        return set(ret);
-    }
+    public static class Meta {
+        public Object repeatTag() { return null; }
+        public Sequence tryResolveTag(String s, String nonTerminalName, Element[] els, Object[] labels, boolean [] drops) {
+            //return resolveTag(s, nonTerminalName, els, labels, drops);
+            return null;
+        }
+        public Sequence resolveTag(String s, String nonTerminalName, Element[] els, Object[] labels, boolean [] drops) {
+            return Sequence.rewritingSequence(s, els, labels, drops);
+        }
+        public class MetaGrammarFile extends HashMap<String,NonTerminal> {
+            public MetaGrammarFile(Tree<String> tree) {
+                if (!tree.head().equals("grammar")) throw new Error();
+                for(Tree<String> nt : tree.child(0))
+                    add(new NonTerminal(nt));
+            }
+            private void add(NonTerminal mnt) {
+                if (this.get(mnt.name)!=null) throw new Error("duplicate definition of nonterminal \""+mnt.name+"\"");
+                this.put(mnt.name, mnt);
+            }
+            public String toString() {
+                String ret = "";
+                for(NonTerminal mnt : this.values()) ret += mnt + "\n";
+                return ret;
+            }
+        }
+        public class NonTerminal {
+            public String    name;
+            public MetaUnion rhs;
+            public NonTerminal(Tree<String> tree) {
+                name = string(tree.child(0));
+                rhs = rhs(tree.child(1));
+            }
+            public String toString() { return name + " = " + rhs; }
+            public Union build(BuildContext bc) {
+                NonTerminal ont = bc.currentNonTerminal;
+                bc.currentNonTerminal = this;
+                try {
+                    return rhs.build(bc, name);
+                } finally {
+                    bc.currentNonTerminal = ont;
+                }
+            }
+        }
+        public MetaUnion rhs(Tree<String> t) {
+            return t.numChildren()==1
+                ? new MetaUnion(t.child(0), false)
+                : new MetaUnion(t, true);
+        }
+        public class MetaUnion implements MetaSequence {
+            public boolean prioritized;
+            public MetaSequence[] sequences;
+            public Sequence buildSequence(BuildContext bc) {
+                return Sequence.singleton(new Element[] { buildAnon(bc) }, 0);
+            }
+            public Union buildAnon(BuildContext bc) {
+                String s = "";
+                for(int i=0; i<sequences.length; i++)
+                    s += (i>0?"\n                "+(prioritized?">":"|")+" ":"")+sequences[i].buildSequence(bc);
+                return build(bc, s);
+            }
+            public Union build(BuildContext bc, String name) {
+                Union u = bc.get(name);
+                if (u != null) return u;
+                u = new Union(name);
+                bc.put(name, u);
+                HashSet<Sequence> seqs = new HashSet<Sequence>();
+                for(MetaSequence s : sequences) {
+                    Sequence seq = s.buildSequence(bc);
+                    if (seq != null) {
+                        Sequence oseq = seq;
+                        if (prioritized)
+                            for(Sequence seqprev : seqs)
+                                seq = seq.not(seqprev);
+                        u.add(seq);
+                        seqs.add(seq);
+                    }
+                }
+                return u;
+            }
+            public MetaUnion(Tree<String> t, boolean prioritized) {
+                this.prioritized = prioritized;
+                int i = 0;
+                this.sequences = new MetaSequence[t.numChildren()];
+                for(Tree<String> tt : t)
+                    sequences[i++] = prioritized
+                        ? new MetaUnion(tt, false)
+                        : makeMetaSequence(tt);
+            }
+            public String toString() {
+                String ret = "\n     ";
+                for(int i=0; i<sequences.length; i++) {
+                    ret += sequences[i];
+                    if (i<sequences.length-1)
+                        ret += (prioritized ? "\n    > " : "\n    | ");
+                }
+                return ret;
+            }
+        }
+
+        public interface MetaSequence {
+            public abstract Sequence buildSequence(BuildContext bc);
+        }
 
-    //////////////////////////////////////////////////////////////////////////////
+        public MetaSequence makeMetaSequence(Tree<String> t) {
+            if ("psx".equals(t.head())) return makeConjunct(t.child(0));
+            if (t.head().equals("&"))  return new MetaAnd(makeMetaSequence(t.child(0)), makeConjunct(t.child(1)), false);
+            if (t.head().equals("&~")) return new MetaAnd(makeMetaSequence(t.child(0)), makeConjunct(t.child(1)), true);
+            return null;
+        }
 
-    public class PreSequence {
-        public final HashSet<Sequence> and  = new HashSet<Sequence>();
-        public final HashSet<Sequence> not  = new HashSet<Sequence>();
-        public /*final*/ String tag;
-        public final Object[] o;
+        public class MetaAnd implements MetaSequence {
+            boolean not;
+            MetaSequence left;
+            MetaSequence right;
+            public Sequence buildSequence(BuildContext bc) {
+                Union u = new Union(toString());
+                Sequence ret = left.buildSequence(bc);
+                Sequence rs = right.buildSequence(bc);
+                rs.lame = true;
+                if (not) ret = ret.not(rs);
+                else     ret = ret.and(rs);
+                u.add(rs);
+                u.add(ret);
+                return Sequence.singleton(u);
+            }
+            public MetaAnd(MetaSequence left, MetaSequence right, boolean not) {
+                this.left = left;
+                this.right = right;
+                this.not = not;
+            }
+            public String toString() { return left + " &"+(not?"~":"")+" "+right; }
+        }
 
-        public PreSequence sparse(Object e) {
-            Object[] ret;
-            boolean[] drops;
-            if (o.length <= 1) {
-                ret = o;
-                drops = new boolean[this.drops.length];
-                System.arraycopy(this.drops, 0, drops, 0, this.drops.length);
-            } else {
-                ret = new Object[o.length * 2 - 1];
-                drops = new boolean[o.length * 2 - 1];
-                for(int i=0; i<o.length; i++) {
-                    Object oi = o[i];
-                    ret[i*2]   = oi;
-                    drops[i*2] = this.drops[i];
-                    if (i*2+1<ret.length) {
-                        ret[i*2+1] = e;
-                        drops[i*2+1] = true;
+        public class Conjunct implements MetaSequence {
+            public boolean negated = false;
+            public MetaClause[] elements;
+            public HashMap<MetaClause,String> labelMap = new HashMap<MetaClause,String>();
+            public MetaClause followedBy = null;
+            public String tag;
+            public MetaClause separator;
+            public void addNamedClause(String name, MetaClause mc) {
+                labelMap.put(mc, name);
+            }
+            public Sequence buildSequence(BuildContext bc) {
+                Element[] els = new Element[elements.length + (separator==null?0:(elements.length-1))];
+                boolean[] drops = new boolean[elements.length + (separator==null?0:(elements.length-1))];
+                Object[] labels = new Object[els.length];
+                boolean unwrap = false;
+                boolean dropAll = false;
+                if (tag!=null && tag.equals("[]")) unwrap = true;
+                if (tag!=null && "()".equals(tag)) dropAll=true;
+
+                NonTerminal old = bc.currentNonTerminal;
+                bc.currentNonTerminal = null;
+                for(int i=0; i<elements.length; i++) {
+                    int j = separator==null ? i : i*2;
+                    els[j] = elements[i].build(bc);
+                    labels[j] = labelMap.get(elements[i]);
+                    drops[j] = elements[i].drop;
+                    if (separator!=null && i<elements.length-1) {
+                        els[j+1] = separator.build(bc);
+                        drops[j+1] = true;
                     }
                 }
+                bc.currentNonTerminal = old;
+
+                Sequence ret = null;
+                if (dropAll)     ret = Sequence.drop(els, false);
+                else if (unwrap) ret = Sequence.unwrap(els, repeatTag(), drops);
+                else if (tag!=null) {
+                    ret = resolveTag(tag, bc.currentNonTerminal==null ? null : bc.currentNonTerminal.name, els, labels, drops);
+                    System.err.println("resolvetag " + tag + " => " + ret);
+                } else {
+                    ret = tryResolveTag(tag, bc.currentNonTerminal==null ? null : bc.currentNonTerminal.name, els, labels, drops);
+                    if (ret==null) {
+                        int idx = -1;
+                        for(int i=0; i<els.length; i++)
+                            if (!drops[i])
+                                if (idx==-1) idx = i;
+                                else throw new Error("multiple non-dropped elements in sequence: " + Sequence.drop(els,false));
+                        if (idx != -1) ret = Sequence.singleton(els, idx);
+                        else           ret = Sequence.drop(els, false);
+                    }
+                }
+                if (this.followedBy != null)
+                    ret.follow = infer(this.followedBy.build(bc));
+                return ret;
+            }
+            private Conjunct(Tree<String> t) {
+                elements = new MetaClause[t.numChildren()];
+                int i = 0; for(Tree<String> tt : t)
+                    elements[i++] = makeMetaClause(tt, this);
+            }
+            public String toString() {
+                String ret = (tag==null ? "" : (tag+":: ")) + (negated ? "~" : "");
+                if (elements.length > 1) ret += "(";
+                for(MetaClause mc : elements) ret += (" " + mc + " ");
+                if (separator != null) ret += " /" + separator;
+                if (followedBy != null) ret += " -> " + followedBy;
+                if (elements.length > 1) ret += ")";
+                return ret;
             }
-            PreSequence p = new PreSequence(ret, tag, drops);
-            p.not.addAll(not);
-            p.and.addAll(and);
-            return p;
         }
+            public Conjunct makeConjunct(Tree<String> t) {
+                //System.err.println("makeConjunct("+t+")");
+                if ("/".equals(t.head())) {
+                    Conjunct ret = makeConjunct(t.child(0));
+                    ret.separator = makeMetaClause(t.child(1), ret);
+                    return ret;
+                }
+                if ("->".equals(t.head())) {
+                    Conjunct ret = makeConjunct(t.child(0));
+                    ret.followedBy = makeMetaClause(t.child(1), ret);
+                    return ret;
+                }
+                if ("::".equals(t.head())) {
+                    Conjunct ret = makeConjunct(t.child(1));
+                    ret.tag = string(t.child(0));
+                    return ret;
+                }
+                if ("ps".equals(t.head())) {
+                    return new Conjunct(t.child(0));
+                }
+                return new Conjunct(t);
+            }
 
-        public PreSequence not(Sequence s) { not.add(s); return this; }
-        public PreSequence and(Sequence s) { and.add(s); return this; }
+            public MetaClause makeMetaClause(Tree<String> t, Conjunct c) {
+                //System.err.println("MetaClause.makeMetaClause("+t+")");
+                if (t==null) return new Epsilon();
+                if (t.head()==null) return new Epsilon();
+                if (t.head().equals("{")) return new MetaTree(makeConjunct(t.child(0)));
+                if (t.head().equals("*")) return new MetaRepeat(makeMetaClause(t.child(0), c), false, null, true, true);
+                if (t.head().equals("+")) return new MetaRepeat(makeMetaClause(t.child(0), c), false, null, false, true);
+                if (t.head().equals("?")) return new MetaRepeat(makeMetaClause(t.child(0), c), false, null, true, false);
+                if (t.head().equals("**")) return new MetaRepeat(makeMetaClause(t.child(0), c), true, null, true, true);
+                if (t.head().equals("++")) return new MetaRepeat(makeMetaClause(t.child(0), c), true, null, false, true);
+                if (t.head().equals("*/")) return new MetaRepeat(makeMetaClause(t.child(0), c), false, makeMetaClause(t.child(1), c), true, true);
+                if (t.head().equals("+/")) return new MetaRepeat(makeMetaClause(t.child(0), c), false, makeMetaClause(t.child(1), c), false, true);
+                if (t.head().equals("**/")) return new MetaRepeat(makeMetaClause(t.child(0), c), true, makeMetaClause(t.child(1), c), true, true);
+                if (t.head().equals("++/")) return new MetaRepeat(makeMetaClause(t.child(0), c), true, makeMetaClause(t.child(1), c), false, true);
+                if (t.head().equals("()")) return new Epsilon();
+                if (t.head().equals("[")) return new MetaRange(t.child(0));
+                if (t.head().equals("literal")) return new StringLiteral(t.child(0));
+                if (t.head().equals("nonTerminal")) return new NonTerminalReference(t.child(0));
+                if (t.head().equals(")")) return new SelfReference();
+                if (t.head().equals("(")) return new Parens(t.child(0));
+                if (t.head().equals("~")) return new MetaInvert(t.child(0), c);
+                if (t.head().equals("!")) { MetaClause mc = makeMetaClause(t.child(0), c); mc.drop = true; return mc; }
+                if (t.head().equals("^")) { c.tag = string(t.child(0)); return new StringLiteral(t.child(0)); }
+                if (t.head().equals("^^")) throw new Error("carets: " + t);
+                if (t.head().equals(":")) {
+                    String name = string(t.child(0));
+                    MetaClause clause = makeMetaClause(t.child(1), c);
+                    c.addNamedClause(name, clause);
+                    return clause;
+                }
+                throw new Error("unknown: " + t);
+            }
 
-        boolean[] drops = null;
-        public PreSequence(Object o) { this(new Object[] { o }, null); }
-        public PreSequence(Object[] o) { this(o, null); }
-        public PreSequence(Object[] o, String tag) { this(o, tag, null); }
-        public PreSequence(Object[] o, String tag, boolean[] drops) {
-            this.o = o;
-            this.tag = tag;
-            this.drops = drops==null ? new boolean[o.length] : drops;
+        public abstract class MetaClause {
+            public String label = null;
+            public boolean drop = false;
+            public boolean lift = false;
+            public abstract Element build(BuildContext bc);
         }
-
-        public Union    buildUnion() {
-            Union u = new Union("???");
-            u.add(buildSequence(u));
-            return u;
+            public class MetaRepeat extends MetaClause {
+                public MetaClause element, separator;
+                public boolean maximal, zero, many;
+                public Element build(BuildContext bc) {
+                    return !maximal
+                        ? (separator==null
+                           ? Sequence.repeat(element.build(bc), zero, many, null, repeatTag())
+                           : Sequence.repeat(element.build(bc), zero, many, separator.build(bc), repeatTag()))
+                        : (separator==null
+                           ? Sequence.repeatMaximal(infer(element.build(bc)), zero, many, repeatTag())
+                           : Sequence.repeatMaximal(element.build(bc), zero, many, infer(separator.build(bc)), repeatTag()));
+                }
+                public MetaRepeat(MetaClause element, boolean maximal, MetaClause separator, boolean zero, boolean many) {
+                    this.separator = separator;
+                    this.element = element;
+                    this.maximal = maximal;
+                    this.zero = zero;
+                    this.many = many;
+                }
+                public String toString() {
+                    return element+
+                        ((zero&&!many)?"?":zero?"*":"+")+
+                        (!maximal?"":zero?"*":"+")+
+                        (separator==null?"":(" /"+separator));
+                }
+            }
+        public class Epsilon extends MetaClause {
+            public String toString() { return "()"; }
+            public Element build(BuildContext bc) { return Union.epsilon; }
         }
-        public Sequence buildSequence(Union u) { return buildSequence(u, false, false); }
-        public Sequence buildSequence(Union u, boolean lame, boolean dropAll) {
-            for(Sequence s : and) u.add(s);
-            for(Sequence s : not) u.add(s);
-            HashSet<Sequence> set = new HashSet<Sequence>();
-            Element[] o2 = o==null ? new Element[0] : new Element[o.length];
-            int nonDrop = 0;
-            if (o != null) {
-                int j = 0;
-                for(int i=0; i<o.length; i++) {
-                    Object oi = o[i];
-                    if (oi==SELF)                    o2[j] = u.new Subset("(("+u+"))", set);
-                    else                             o2[j] = (Element)oi;
+            public class Parens extends MetaClause {
+                public MetaUnion body;
+                public Parens(Tree<String> t) { this.body = rhs(t); }
+                public String toString() { return "( " + body + " )"; }
+                public Element build(BuildContext bc) { return body.buildAnon(bc); }
+            }
 
-                    if (MetaGrammar.dropAll.contains(o2[j])) drops[j] = true;
-                    nonDrop += drops[j] ? 0 : 1;
-                    o2[j] = o2[j];
-                    j++;
+            public class MetaTree extends MetaClause {
+                public Conjunct body;
+                public MetaTree(Conjunct c) { this.body = c; }
+                public String toString() { return "{ " + body + " }"; }
+                public Element build(BuildContext bc) {
+                    Union u = new Union();
+                    Union u2 = new Union();
+                    Sequence seq = body.buildSequence(bc);
+                    u2.add(seq);
+                    u.add(Sequence.singleton(new Element[] { CharRange.leftBrace,
+                                                             new NonTerminalReference("ws").build(bc),
+                                                             u2,
+                                                             new NonTerminalReference("ws").build(bc),
+                                                             CharRange.rightBrace }
+                                             , 2));
+                    //u.add(seq);
+                    return u;
                 }
             }
-            Element[] expansion = o2;
-            Sequence ret = null;
-            if (dropAll || lame) ret = Sequence.drop(expansion, and, not, lame);
-            else if (tag!=null) ret = Sequence.rewritingSequence(tag, expansion, drops, and, not);
-            else {
-                int idx = -1;
-                for(int i=0; i<expansion.length; i++) {
-                    if (!drops[i]) idx = i;
-                    else expansion[i] = expansion[i];
+
+            public class MetaRange extends MetaClause {
+                Range.Set range = new Range.Set();
+                public String toString() { return range.toString(); }
+                public Element build(BuildContext bc) { return set(range); }
+                public MetaRange(Tree<String> t) {
+                    for(Tree<String> tt : t) {
+                        if (tt.head().equals("range")) {
+                            range.add(tt.child(0).head().charAt(0));
+                        } else if (tt.head().equals("-")) {
+                            range.add(new Range(string(tt.child(0)).charAt(0),
+                                                string(tt.child(1)).charAt(0)));
+                        }
+                    }
                 }
-                ret = idx==-1 ? Sequence.drop(expansion, and, not, false) : Sequence.singleton(expansion, idx, and, not);
             }
-            set.add(ret);
-            return ret;
-        }
+            public class StringLiteral extends MetaClause {
+                public String literal;
+                public Element build(BuildContext bc) { return string(literal); }
+                public StringLiteral(Tree<String> literal) { this.literal = string(literal); this.drop = true; }
+                public String toString() { return "\""+StringUtil.escapify(literal, "\"\r\n\\")+"\""; }
+            }
+            public class NonTerminalReference extends MetaClause {
+                public String name;
+                public NonTerminalReference(Tree<String> name) { this.name = string(name); }
+                public NonTerminalReference(String name) { this.name = name; }
+                public Element build(BuildContext bc) { return bc.build(name); }
+                public String toString() { return name; } 
+            }
+            public class SelfReference extends MetaClause {
+                public String toString() { return "(*)"; } 
+                public Element build(BuildContext bc) { return new Union("(*)"); /* FIXME */ }
+            }
+            public class MetaInvert extends MetaClause {
+                public MetaClause element;
+                public MetaInvert(Tree<String> t, Conjunct c) { this.element = makeMetaClause(t, c); }
+                public String toString() { return "~"+element; }
+                public Element build(BuildContext bc) { return infer((Topology<Character>)Atom.toAtom(element.build(bc)).complement()); }
+            }
+
     }
 
     public static void main(String[] args) throws Exception {
@@ -237,7 +416,9 @@ public class MetaGrammar extends ReflectiveWalker {
             System.err.println("usage: java " + MetaGrammar.class.getName() + " grammarfile.g com.yourdomain.package.ClassName");
             System.exit(-1);
         }
-
+        //StringBuffer sbs = new StringBuffer();
+        //((MetaGrammar)new MetaGrammar().walk(meta)).nt.get("e").toString(sbs);
+        //System.err.println(sbs);
         String className   = args[1].substring(args[1].lastIndexOf('.')+1);
         String packageName = args[1].substring(0, args[1].lastIndexOf('.'));
         String fileName    = packageName.replace('.', '/') + "/" + className + ".java";
@@ -253,7 +434,18 @@ public class MetaGrammar extends ReflectiveWalker {
         }
 
         out.append("\n        // DO NOT EDIT STUFF BELOW: IT IS AUTOMATICALLY GENERATED\n");
-        new Parser(MetaGrammar.make(), CharToken.top()).parse1(new CharToken.Stream(new InputStreamReader(new FileInputStream(args[0])))).toJava(out);
+        Tree<String> ts = new CharParser(MetaGrammar.make()).parse(new FileInputStream(args[0])).expand1();
+
+        //Forest<String> fs = new CharParser(make()).parse(new FileInputStream(args[0]));
+        //System.out.println(fs.expand1());
+
+        //GraphViz gv = new GraphViz();
+        //fs.toGraphViz(gv);
+        //FileOutputStream fox = new FileOutputStream("out.dot");
+        //gv.dump(fox);
+        //fox.close();
+
+        ts.toJava(out);
         out.append("\n        // DO NOT EDIT STUFF ABOVE: IT IS AUTOMATICALLY GENERATED\n");
 
         for(String s = br.readLine(); s != null; s = br.readLine()) out.append(s+"\n");
@@ -266,500 +458,4 @@ public class MetaGrammar extends ReflectiveWalker {
         os.close();
     }
 
-    public static final Tree meta =
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-        // 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[] { })}),
-        new Tree(null, null, 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, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})}),
-        new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "g", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "m", new Tree[] { }),
-        new Tree(null, "m", new Tree[] { }),
-        new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "r", 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, null, new Tree[] { new Tree(null, "g", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "a", 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, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "g", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "m", new Tree[] { }),
-        new Tree(null, "m", new Tree[] { }),
-        new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { })}),
-        new Tree(null, null, 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, "+/", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "r", 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, null, new Tree[] { new Tree(null, "g", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "m", new Tree[] { }),
-        new Tree(null, "m", new Tree[] { }),
-        new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { })})})})})}),
-        new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "r", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", 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, "o", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "d", 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, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "l", new Tree[] { }),
-        new Tree(null, "t", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { }),
-        new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "t", new Tree[] { }),
-        new Tree(null, "i", new Tree[] { }),
-        new Tree(null, "v", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "s", 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, "ps2", 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, "o", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "d", 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, "=", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "l", new Tree[] { }),
-        new Tree(null, "t", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { }),
-        new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "t", new Tree[] { }),
-        new Tree(null, "i", new Tree[] { }),
-        new Tree(null, "v", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "s", 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, "a", new Tree[] { }),
-        new Tree(null, "l", new Tree[] { }),
-        new Tree(null, "t", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { }),
-        new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "t", new Tree[] { }),
-        new Tree(null, "i", new Tree[] { }),
-        new Tree(null, "v", new Tree[] { }),
-        new Tree(null, "e", 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, "(", 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, "c", new Tree[] { }),
-        new Tree(null, "o", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { }),
-        new Tree(null, "j", new Tree[] { }),
-        new Tree(null, "u", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { }),
-        new Tree(null, "c", new Tree[] { }),
-        new Tree(null, "t", new Tree[] { }),
-        new Tree(null, "s", 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, "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, "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, null, 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, "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, "c", new Tree[] { }),
-        new Tree(null, "o", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { }),
-        new Tree(null, "j", new Tree[] { }),
-        new Tree(null, "u", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { }),
-        new Tree(null, "c", new Tree[] { }),
-        new Tree(null, "t", 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, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "s", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "q", new Tree[] { }),
-        new Tree(null, "u", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { }),
-        new Tree(null, "c", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { })})})})}),
-        new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "s", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "q", new Tree[] { }),
-        new Tree(null, "u", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { }),
-        new Tree(null, "c", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "&", 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, "e", 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, "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, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "s", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "q", new Tree[] { }),
-        new Tree(null, "u", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { }),
-        new Tree(null, "c", new Tree[] { }),
-        new Tree(null, "e", 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, "*/", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", 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, "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, "p", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })}),
-        new Tree(null, null, 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, "*/", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", 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, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})}),
-        new Tree(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, 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, "e", 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, "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, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "q", new Tree[] { }),
-        new Tree(null, "u", new Tree[] { }),
-        new Tree(null, "o", new Tree[] { }),
-        new Tree(null, "t", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "d", 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, "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, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", 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, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { }),
-        new Tree(null, "2", new Tree[] { })})})})})}),
-        new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { }),
-        new Tree(null, "x", 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, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "/", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", 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, "s", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "q", new Tree[] { }),
-        new Tree(null, "u", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { }),
-        new Tree(null, "c", new Tree[] { }),
-        new Tree(null, "e", 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, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { }),
-        new Tree(null, "x", new Tree[] { })})})})}),
-        new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { }),
-        new Tree(null, "x", 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, "(", 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, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "o", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "d", 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, "q", new Tree[] { }),
-        new Tree(null, "u", new Tree[] { }),
-        new Tree(null, "o", new Tree[] { }),
-        new Tree(null, "t", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "d", 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, "e", new Tree[] { }),
-        new Tree(null, "c", 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, null, new Tree[] { new Tree(null, "range", new Tree[] { new Tree(null, "-", new Tree[] { })}),
-        new Tree(null, "range", new Tree[] { new Tree(null, "]", new Tree[] { })}),
-        new Tree(null, "range", new Tree[] { new Tree(null, "\\", new Tree[] { })}),
-        new Tree(null, "range", new Tree[] { new Tree(null, "~", 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, "e", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { }),
-        new Tree(null, "c", new Tree[] { }),
-        new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "p", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "d", new Tree[] { })})})})})})})}),
-        new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { }),
-        new Tree(null, "g", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { })}),
-        new Tree(null, null, 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, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "c", new Tree[] { })})})})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { }),
-        new Tree(null, "g", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { })})}),
-        new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "c", new Tree[] { })})})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "-", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "c", new Tree[] { })})})})})})})}),
-        new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })}),
-        new Tree(null, null, 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, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "o", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "d", new Tree[] { })})})})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "n", new Tree[] { }),
-        new Tree(null, "o", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { }),
-        new Tree(null, "T", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "m", new Tree[] { }),
-        new Tree(null, "i", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { }),
-        new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "l", new Tree[] { })})}),
-        new Tree(null, "=>", 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, "q", new Tree[] { }),
-        new Tree(null, "u", new Tree[] { }),
-        new Tree(null, "o", new Tree[] { }),
-        new Tree(null, "t", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "d", new Tree[] { })})})})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "l", new Tree[] { }),
-        new Tree(null, "i", new Tree[] { }),
-        new Tree(null, "t", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "l", new Tree[] { })})}),
-        new Tree(null, "ps2", new Tree[] { new Tree(null, null, 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, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { }),
-        new Tree(null, null, new Tree[] { new Tree(null, "{", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "s", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "q", new Tree[] { }),
-        new Tree(null, "u", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { }),
-        new Tree(null, "c", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { })})}),
-        new Tree(null, "literal", 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, "s", new Tree[] { })})})}),
-        new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { }),
-        new Tree(null, null, new Tree[] { new Tree(null, "[", 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, "r", new Tree[] { }),
-        new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { }),
-        new Tree(null, "g", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "]", new Tree[] { })})})})}),
-        new Tree(null, "ps2", new Tree[] { new Tree(null, null, 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, "*", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { }),
-        new Tree(null, "g", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, "literal", 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, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", 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, 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, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", 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, null, new Tree[] { new Tree(null, "*", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { })})})})})})}),
-        new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", 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, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", 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, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", 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, 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, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", 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, null, new Tree[] { new Tree(null, "+", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { })})})})})})}),
-        new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", 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, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", 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, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "?", 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, "/", new Tree[] { new Tree(null, "ps2", 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, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "o", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "d", new Tree[] { })})})}),
-        new Tree(null, null, new Tree[] { new Tree(null, ")", 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, null, new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { }),
-        new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "l", new Tree[] { }),
-        new Tree(null, "t", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { }),
-        new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "t", new Tree[] { }),
-        new Tree(null, "i", new Tree[] { }),
-        new Tree(null, "v", new Tree[] { }),
-        new Tree(null, "e", 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, "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, null, new Tree[] { new Tree(null, 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, "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, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\n", 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, "\r", new Tree[] { })})})})})})})}),
-        new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "o", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "d", 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, "-", new Tree[] { new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "z", new Tree[] { })}),
-        new Tree(null, "-", new Tree[] { new Tree(null, "A", new Tree[] { }),
-        new Tree(null, "Z", new Tree[] { })}),
-        new Tree(null, "-", new Tree[] { new Tree(null, "0", new Tree[] { }),
-        new Tree(null, "9", new Tree[] { })}),
-        new Tree(null, "range", new Tree[] { new Tree(null, "_", new Tree[] { })})})})})})})})})}),
-        new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "q", new Tree[] { }),
-        new Tree(null, "u", new Tree[] { }),
-        new Tree(null, "o", new Tree[] { }),
-        new Tree(null, "t", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "d", 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, "literal", 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, 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, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "[~", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "range", new Tree[] { new Tree(null, "\"", new Tree[] { })}),
-        new Tree(null, "range", new Tree[] { new Tree(null, "\\", 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, "e", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { }),
-        new Tree(null, "c", new Tree[] { }),
-        new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "p", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "d", 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, "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, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { }),
-        new Tree(null, "c", new Tree[] { }),
-        new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "p", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "d", new Tree[] { })}),
-        new Tree(null, null, 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, "n", new Tree[] { })})})})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "\n", 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, "r", new Tree[] { })})})})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "\r", 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, null, new Tree[] { new Tree(null, "range", new Tree[] { new Tree(null, "n", new Tree[] { })}),
-        new Tree(null, "range", new Tree[] { new Tree(null, "r", new Tree[] { })})})})})})})})})})}),
-        new Tree(null, null, new Tree[] { })})
-        // DO NOT EDIT STUFF ABOVE: IT IS AUTOMATICALLY GENERATED
-        ;
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-