checkpoint
[sbp.git] / src / edu / berkeley / sbp / misc / MetaGrammar.java
index 6224fa0..f93c53b 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 String toString() {
-        StringBuffer ret = new StringBuffer();
-        for(Union u : nt.values()) u.toString(ret);
-        return ret.toString();
+    public static Object repeatTag = null;
+
+    /** an atom which tracks the possible tokenset of some element, provided that element can only match single-token sequences */
+    public static class Infer<T extends Input> extends Atom<T> {
+        private final Element e;
+        public Infer(Element e) { this.e = e; }
+        public Topology<T> top() { return (Topology<T>)toAtom(e); }
+        public String toString() { return e.toString(); }
     }
 
-    // FIXME
-    private static HashSet<Union> dropAll = new HashSet<Union>();
+    /** an atom which tracks the inverse of some other atom */
+    public static class Invert<T extends Input> extends Atom<T> {
+        private final Atom<T> a;
+        public Invert(Atom<T> a) { this.a = a; }
+        public Topology<T> top() { return a.complement(); }
+        public String toString() { return "~"+a; }
+    }
 
-    // Statics //////////////////////////////////////////////////////////////////////////////
+    public static class Hack<T extends Input> extends Atom<T> {
+        private final Atom<T> a;
+        static final Topology leftright = CharRange.rightBrace.union(CharRange.leftBrace);
+        public Hack(Atom<T> a) { this.a = a; }
+        public Topology<T> top() { return a.minus(leftright); }
+        public String toString() { return a.toString(); }
+    }
 
-    private static final Union SELF = new Union("()");
+    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 MetaGrammar.Meta.MetaGrammarFile(tree);
+        BuildContext bc = new BuildContext(mgf);
+        return mgf.get(nt).build(bc);
+    }
 
-    public static Union epsilon = new Union("()");
-    static { epsilon.add(Sequence.empty); }
+    ////////////////////////////////////////////////////////////////////////////////
 
-    // MetaGrammar //////////////////////////////////////////////////////////////////////////////
+    private static boolean strings;
+    private static Element  set(Range.Set r) { if (strings) throw new Error(); return CharRange.set(r); }
+    private static Element  string(String s) { return strings ? StringInput.string(s) : CharRange.string(s); }
 
-    public Object     _star_(Element r) { return new Rep(r, null, false, true); }
-    public Element     _leftbracket_(Object o, Object[] args) { return rangex(o==null || !(o instanceof Character) ? null : o, args); }
-    public Union       _colon__colon__equals_(String s, PreSequence[][] p) { return nonTerminalZ(s, p); }
-    public Union       _bang__colon__colon__equals_(String s, PreSequence[][] p) { return nonTerminalZ(s, p, true); }
-    public Union       _colon__colon__equals_(boolean q, String s, PreSequence[][] p) { return nonTerminalZ(s, p, q); }
-    public Element     _leftparen__rightparen_()               { return epsilon; }
-    public Element     epsilon(Object o, Object b)               { return epsilon; }
-    public Element     _rightparen_(Object e)                 { return SELF; }
+    private MetaGrammar() { }
 
-    public PreSequence _amp_(PreSequence p, Object[] o) {
-        p.needs.add(new PreSequence(o, null, true));
-        return p;
+    public static String string(Iterable<Tree<String>> children) {
+        String ret = "";
+        for(Tree<String> t : children) ret += string(t);
+        return ret;
     }
-    public PreSequence _amp__tilde_(PreSequence p, Object[] o) {
-        p.hates.add(new PreSequence(o, null, true));
-        return p;
+    public static String string(Tree<String> tree) {
+        String ret = "";
+        if (tree.head()!=null) ret += tree.head();
+        ret += string(tree.children());
+        return ret;
     }
 
-    public Element     _bang_(Element r)                       { return r; }
-    public Object      care(String s)                          { return new MyLift(s); }
-    //public Element     _backtick_(Element r)                   { return new Unwrap(r); }
-    //public Element     _hash_(Element e)                       { return e; }
-    //public Element     _hash_(Element e)                       { return _plus__plus_(e); }
-
-    public PreSequence[] alternatives(PreSequence[] s) { return s; }
-        
-    public Range       _minus_(Character a, Character b)   { return b==null ? new Range(a.charValue(), true) : new Range(a.charValue(), b.charValue()); }
-    public Union       nonTerminalY(String s) { return nonTerminalX(s, false, false); }
-    public Union nonTerminalX(String s, boolean synthetic, boolean dropAll) {
-        Union n = s.equals(startSymbol) ? g : nt.get(s);
-        if (n == null) nt.put(s, n = new Union(s, synthetic));
-        if (dropAll) this.dropAll.add(n);
-        return n;
-    }
-    public Object  _leftparen_(PreSequence[][] p) { return nonTerminalZ(p); }
-    public Union       nonTerminalZ(PreSequence[][] p)           { return nonTerminalX("anon"+(anon++), p, false, false); }
-    public Union       nonTerminalZ(String s, PreSequence[][] p) { return nonTerminalX(s, p, false, false); }
-    public Union       nonTerminalZ(String s, PreSequence[][] p, boolean q) { return nonTerminalX(s, p, false, q); }
-    public Object  _backslash__leftbrace_(String s)      { return SELF; }
-    public Object  _leftbrace_(String s)                 { return SELF; }
-    public Object _plus_(final Element r) { return new Rep(r, null, false, false); }
-    public Object[] _slash_(Object[] o, Object sep) {
-        if (o.length <= 1) return o;
-        Object[] ret = new Object[o.length * 2 - 1];
-        for(int i=0; i<o.length; i++) {
-            Object oi = o[i];
-            //if (oi instanceof Rep) oi = ((Rep)oi).build(new MyDrop(sep));
-            ret[i*2]   = oi;
-            if (i*2+1<ret.length) ret[i*2+1] = new MyDrop(sep);
+    public static class BuildContext extends HashMap<String,Union> {
+        private final Meta.MetaGrammarFile mgf;
+        public BuildContext(Meta.MetaGrammarFile mgf) { this.mgf = mgf; }
+        public Union build(String s) {
+            Union ret = get(s);
+            if (ret != null) return ret;
+            Meta.MetaNonterminal mnt = mgf.get(s);
+            if (mnt==null) throw new Error("undeclared nonterminal \""+s+"\"");
+            return mnt.build(this);
         }
-        return ret;
-    }
-    //public Element _tilde__slash__tilde_(final Element r) { return Repeat.maximal(r); }
-    public Object _plus__slash_(final Element r, Object s) {
-        if (s instanceof String) s = CharToken.string((String)s);
-        return new Rep(r, (Element)s, false, false);
     }
-    public Object _dollar__dollar_(final Element r, Object s) {
-        if (s instanceof String) s = CharToken.string((String)s);
-        return new Rep(r, (Element)s, false, false);
-    }
-    public Object _star__slash_(final Element r, Object s) {
-        if (s instanceof String) s = CharToken.string((String)s);
-        return new Rep(r, (Element)s, false, true);
-    }
-    public Object _percent__percent_(final Element r, Object s) {
-        if (s instanceof String) s = CharToken.string((String)s);
-        return new Rep(r, (Element)s, false, true);
-    }
-    //public Element _star__slash_(final Element r, Element s) { return Repeat.many0(r, s); }
-    public Object _star__star_(final Element r) { return new Rep(r, null, true, true); }
-    public Object _plus__plus_(final Element r) { return new Rep(r, null, true, false); }
-    public Element _question_(final Element r) { return Repeat.maybe(r); }
-    public MetaGrammar gram(Object o, MetaGrammar g, Object o2) { return g; }
-    public MetaGrammar  grammar(Object[] o) { return this; }
-    public MetaGrammar grammar(Object o, Union[] u, Object x) { return this; }
-    public char    _backslash_n() { return '\n'; }
-    public char    _backslash_r() { return '\r'; }
-    public String  literal(String s) { return s; }
-    //public Element  literal(String s)    { return CharToken.string(s); }
 
-    public Range     range0(char a)         { return new Range(a, a); }
-    public Range     range0(char a, char b) { return new Range(a, b); }
-    public Range     range1(char a, char b) { return new Range(a, b); }
-    public Element   rangex(Range[] rr) { return range("~", rr); }
-    public Element   range(Range[] rr) { return range(null, rr); }
-    public Element   range(Object o, Range[] rr) {
-        Range.Set ret = !"~".equals(o+"") ? new Range.Set() : new Range.Set(new Range(true, true));
-        if (rr != null)
-            for(Range r : rr)
-                if (!"~".equals(o+"")) ret.add(r);
-                else                   ret.remove(r);
-        return CharToken.set(ret);
-    }
-    public Element rangex(Object o, Object[] r) {
-        Range.Set ret = o==null ? new Range.Set() : new Range.Set(new Range(true, true));
-        if (r != null)
-            for(Object aa : r) {
-                Range range =
-                    aa instanceof Range
-                    ? (Range)aa
-                    : aa instanceof Character
-                    ? new Range(((Character)aa).charValue())
-                    : new Range(((String)aa).charAt(0));
-                if (o==null) ret.add(range);
-                else         ret.remove(range);
+    public static class Meta {
+        public static class MetaGrammarFile extends HashMap<String,MetaNonterminal> {
+            public MetaGrammarFile(Tree<String> tree) {
+                if (!tree.head().equals("grammar")) throw new Error();
+                for(Tree<String> nt : tree.child(0))
+                    add(new MetaNonterminal(nt));
             }
-        return CharToken.set(ret);
-    }
-
-    public String sify(Object arg) {
-        if (arg==null) return "";
-        if (arg instanceof String) return (String)arg;
-        Object[] args = (Object[])arg;
-        while(true) {
-            args = Reflection.lub(args);
-            if (args instanceof String[]) {
-                StringBuffer ret = new StringBuffer();
-                for(String s : ((String[])args)) ret.append(s);
-                return ret.toString();
+            private void add(MetaNonterminal 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(MetaNonterminal mnt : this.values()) ret += mnt + "\n";
+                return ret;
             }
-            if (args instanceof Character[]) break;
-            if (!(args instanceof Object[])) break;
-            args = (Object[])args[0];
         }
-        if (args instanceof Character[]) {
-            char[] c = new char[args.length];
-            for(int i=0; i<c.length; i++) c[i] = ((Character)args[i]).charValue();
-            String s = new String(c, 0, c.length);
-            return s;
+        public static class MetaNonterminal {
+            public String    name;
+            public MetaUnion rhs;
+            public MetaNonterminal(Tree<String> tree) {
+                name = string(tree.child(0));
+                rhs = rhs(tree.child(1));
+            }
+            public String toString() { return name + " = " + rhs; }
+            public Union build(BuildContext bc) { return rhs.build(bc, name); }
         }
-        return (String)args[0];
-    }
-
-
-    ////////////////////////////////////////////////////////////////////////////////
-
-    private Union g;
-    private HashMap<String,Union> nt;
-    private int anon = 0;
-    private Element dws;
-    private String startSymbol;
-
-    public MetaGrammar() { this("s"); }
-    public MetaGrammar(String s) { 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>();
-        nt.put(str, g);
-        this.dws = Repeat.maximal(Repeat.many0(nonTerminalY("w")));
-        return ret;
-    }
-
-    public Union nonTerminalX(String str, PreSequence[][] s, boolean synthetic, boolean dropAll) {
-        Union n = nonTerminalX(str, synthetic, dropAll);
-        if (s == null || s.length==0) { n.add(Sequence.empty); 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.hatess.addAll(seqs);
-                Sequence seq = pre.buildSequence(n, false, dropAll);
-                temp.add(seq);
-                //for(Sequence dom : seqs) seq.hates.add(dom);
-                n.add(seq);
+        public static MetaUnion rhs(Tree<String> t) {
+            return t.numChildren()==1
+                ? new MetaUnion(t.child(0), false)
+                : new MetaUnion(t, true);
+        }
+        public static 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) {
+                //System.err.println("metaunion: " + t);
+                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;
             }
-            seqs.addAll(temp);
         }
-        return n;
-    }
-
-    public String stringify(String s) { return StringUtil.unescapify(s); }
-    public char unescape(char x, char c) { return unescape(c); }
-    public char unescape(char c) { return StringUtil.unescapify("\\"+c).charAt(0); }
-    public PreSequence sequence(Object[] o) { return new PreSequence(o, null); }
 
-    public static class PreBrace {
-        public final Object[] o;
-        public PreBrace(Object[] o) { this.o = o; }
-    }
-
-    public PreSequence _equals__greater_(Object[] o, String s) { return new PreSequence(o, s); }
-    public PreSequence wrap(Object[] o) { return new PreSequence(o, ""); }
-    public PreSequence mwrap(Object[] o) { return new PreSequence(o, ""); }
-    public PreSequence rewrite(Object[] o) { return new PreSequence(o, null); }
-    public PreSequence rewrite(Object[] o, Object o2) {
-        Object[] o3 = new Object[o.length + 1];
-        System.arraycopy(o, 0, o3, 0, o.length);
-        o3[o3.length-1] = o2;
-        return rewrite(o3);
-    }
-        
-    public static class Rep {
-        private final Element e;
-        private final Element s;
-        private final boolean maximal;
-        private final boolean zero;
-        public Rep(Element e, Element s, boolean maximal, boolean zero) { this.e = e; this.s = s; this.zero = zero; this.maximal = maximal;}
-        public Element build() {
-            Element sep = s;
-            Element ret = zero ? Repeat.many0(e, sep) :  Repeat.many1(e, sep);
-            return maximal ? Repeat.maximal(ret) : ret;
+        public interface MetaSequence {
+            public abstract Sequence buildSequence(BuildContext bc);
         }
-    }
-
-    public static class PreSequence {
-        public final HashSet<PreSequence> needs  = new HashSet<PreSequence>();
-        public final HashSet<PreSequence> hates  = new HashSet<PreSequence>();
-        public final HashSet<Sequence> hatess = new HashSet<Sequence>();
-        public /*final*/ String tag;
-        public final Object[] o;
-        public final boolean keeper;
-
-        public PreSequence(Object[] o, String tag) { this(o, tag, false); }
-        public PreSequence(Object[] o, String tag, boolean keeper) { this.o = o; this.tag = tag; this.keeper = keeper; }
-        boolean[] drops = null;
-        public Element[] expand(Union u, HashSet<Sequence> set) {
-            if (o==null) return new Element[0];
-            Element[] o2 = new Element[o.length];
-            drops = new boolean[o.length];
-            int j = 0;
-            for(int i=0; i<o.length; i++) {
-                Object oi = o[i];
-                if (oi instanceof MyDrop)      { oi = ((MyDrop)oi).o; drops[j] = true; }
-                if      (oi instanceof PreSequence) o2[j] = ((PreSequence)oi).buildUnion();
-                else if (oi==SELF)                  o2[j] = u.new Subset("(("+u+"))", set);
-                else if (oi instanceof MyLift)      { o2[j] = CharToken.string(tag = ((MyLift)oi).s); drops[j] = true; }
-                else if (oi instanceof String)      { o2[j] = CharToken.string(      ((String)oi)  ); drops[j] = true; }
-                else if (oi instanceof Rep)         o2[j] = ((Rep)oi).build();
-                else                                  o2[j] = (Element)oi;
 
-                if (dropAll.contains(o2[j])) drops[j] = true;
+        public static MetaSequence makeMetaSequence(Tree<String> t) {
+            if ("psx".equals(t.head())) return MetaConjunct.make(t.child(0));
+            if (t.head().equals("&"))  return new MetaAnd(makeMetaSequence(t.child(0)), MetaConjunct.make(t.child(1)), false);
+            if (t.head().equals("&~")) return new MetaAnd(makeMetaSequence(t.child(0)), MetaConjunct.make(t.child(1)), true);
+            return null;
+        }
 
-                o2[j] = o2[j];
-                j++;
+        public static 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);
             }
-            return o2;
-        }
-        public Union    buildUnion() {
-            Union u = new Union("???");
-            u.add(buildSequence(u));
-            return 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 Sequence buildSequence(Union u) { return buildSequence(u, false, false); }
-        public Sequence buildSequence(Union u, boolean lame, boolean dropAll) {
 
-            HashSet<Sequence> and = new HashSet<Sequence>();
-            HashSet<Sequence> not = new HashSet<Sequence>();
-            for(PreSequence p : needs) {
-                Sequence ps = p.buildSequence(u, true, dropAll);
-                u.add(ps);
-                and.add(ps);
+        public static class MetaConjunct implements MetaSequence {
+            public boolean negated = false;
+            public MetaClause[] elements;
+            public MetaClause followedBy = null;
+            public String tag;
+            public MetaClause separator;
+            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))];
+                boolean unwrap = false;
+                boolean dropAll = false;
+                if (tag!=null && tag.equals("[]")) unwrap = true;
+                if (tag!=null && "()".equals(tag)) dropAll=true;
+                for(int i=0; i<elements.length; i++) {
+                    int j = separator==null ? i : i*2;
+                    els[j] = elements[i].build(bc);
+                    drops[j] = elements[i].drop;
+                    if (separator!=null && i<elements.length-1) {
+                        els[j+1] = separator.build(bc);
+                        drops[j+1] = true;
+                    }
+                }
+                Sequence ret = null;
+                if (dropAll)     ret = Sequence.drop(els, false);
+                else if (unwrap) ret = Sequence.unwrap(els, /*repeatTag FIXME*/null, drops);
+                else if (tag!=null) ret = Sequence.rewritingSequence(tag, els, new Object[els.length], drops);
+                else {
+                    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 = new Hack(new Infer(this.followedBy.build(bc)));
+                return ret;
+            }
+            private MetaConjunct(Tree<String> t) {
+                //System.err.println("MetaConjunct("+t+")");
+                elements = new MetaClause[t.numChildren()];
+                int i = 0; for(Tree<String> tt : t)
+                    elements[i++] = MetaClause.make(tt, this);
             }
-            for(Sequence p : hatess) not.add(p);
-            for(PreSequence p : hates) {
-                Sequence ps = p.buildSequence(u, true, dropAll);
-                u.add(ps);
-                not.add(ps);
+            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;
             }
+            public static MetaConjunct make(Tree<String> t) {
+                //System.err.println("MetaConjunct.make("+t+")");
+                if ("/".equals(t.head())) {
+                    MetaConjunct ret = make(t.child(0));
+                    ret.separator = MetaClause.make(t.child(1), ret);
+                    return ret;
+                }
+                if ("->".equals(t.head())) {
+                    MetaConjunct ret = make(t.child(0));
+                    ret.followedBy = MetaClause.make(t.child(1), ret);
+                    return ret;
+                }
+                if ("::".equals(t.head())) {
+                    MetaConjunct ret = make(t.child(1));
+                    ret.tag = string(t.child(0));
+                    return ret;
+                }
+                if ("ps".equals(t.head())) {
+                    return new MetaConjunct(t.child(0));
+                }
+                return new MetaConjunct(t);
+            }
+        }
 
-            HashSet<Sequence> set = new HashSet<Sequence>();
-            Element[] expansion = expand(u, set);
-            boolean keeper = this.keeper;
-            Sequence ret = dropAll || lame || keeper ? Sequence.drop(expansion, and, not, lame) : null;
-            if (ret==null && tag!=null) {
-                for(int i=0; i<expansion.length; i++) expansion[i] = expansion[i];
-                ret = Sequence.rewritingSequence(tag, expansion, drops, and, not);
+        public static abstract class MetaClause {
+            public String label = null;
+            public boolean drop = false;
+            public boolean lift = false;
+            public abstract Element build(BuildContext bc);
+            public static MetaClause make(Tree<String> t, MetaConjunct c) {
+                //System.err.println("MetaClause.make("+t+")");
+                if (t==null) return new MetaEpsilon();
+                if (t.head()==null) return new MetaEpsilon();
+                if (t.head().equals("{")) throw new Error("metatree: " + t);
+                if (t.head().equals("*")) return new MetaRepeat(make(t.child(0), c), false, null, true, true);
+                if (t.head().equals("+")) return new MetaRepeat(make(t.child(0), c), false, null, false, true);
+                if (t.head().equals("?")) return new MetaRepeat(make(t.child(0), c), false, null, true, false);
+                if (t.head().equals("**")) return new MetaRepeat(make(t.child(0), c), true, null, true, true);
+                if (t.head().equals("++")) return new MetaRepeat(make(t.child(0), c), true, null, false, true);
+                if (t.head().equals("*/")) return new MetaRepeat(make(t.child(0), c), false, make(t.child(1), c), true, true);
+                if (t.head().equals("+/")) return new MetaRepeat(make(t.child(0), c), false, make(t.child(1), c), false, true);
+                if (t.head().equals("**/")) return new MetaRepeat(make(t.child(0), c), true, make(t.child(1), c), true, true);
+                if (t.head().equals("++/")) return new MetaRepeat(make(t.child(0), c), true, make(t.child(1), c), false, true);
+                if (t.head().equals("()")) return new MetaEpsilon();
+                if (t.head().equals("[")) return new MetaRange(t.child(0));
+                if (t.head().equals("literal")) return new MetaStringLiteral(t.child(0));
+                if (t.head().equals("nonTerminal")) return new MetaNonterminalReference(t.child(0));
+                if (t.head().equals(")")) return new MetaSelfReference();
+                if (t.head().equals("(")) return new MetaParens(t.child(0));
+                if (t.head().equals("~")) return new MetaInvert(t.child(0), c);
+                if (t.head().equals("!")) { MetaClause mc = make(t.child(0), c); mc.drop = true; return mc; }
+                if (t.head().equals("^")) { c.tag = string(t.child(0)); return new MetaStringLiteral(t.child(0)); }
+                if (t.head().equals("^^")) throw new Error("carets: " + t);
+                throw new Error("unknown: " + t);
+            }
+            public static class MetaRepeat extends MetaClause {
+                public MetaClause element, separator;
+                public boolean maximal, zero, many;
+                public Element build(BuildContext bc) {
+                    return new Repeat(element.build(bc), zero, many, separator==null?null:separator.build(bc), maximal);
+                }
+                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 static class MetaParens extends MetaClause {
+                public MetaUnion body;
+                public MetaParens(Tree<String> t) { this.body = rhs(t); }
+                public String toString() { return "( " + body + " )"; }
+                public Element build(BuildContext bc) { return body.buildAnon(bc); }
+            }
+            /*
+            public static class MetaTree extends MetaClause {
+                public MetaConjunct body;
+                public MetaTree(Tree<String> t) { this.body = MetaConjunct.make(t); }
+                public String toString() { return "{ " + body + " }"; }
+                public Element build(BuildContext bc) {
+                    return new Union("{}");// body.buildSequence();
+                }
             }
-            if (ret==null) {
-                int idx = -1;
-                for(int i=0; i<expansion.length; i++) {
-                    if (!drops[i]) idx = i;
-                    else expansion[i] = expansion[i];
+            */
+            public static class MetaEpsilon extends MetaClause {
+                public String toString() { return "()"; }
+                public Element build(BuildContext bc) { return Union.epsilon; }
+            }
+            public static 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 static class MetaStringLiteral extends MetaClause {
+                public String literal;
+                public Element build(BuildContext bc) { return string(literal); }
+                public MetaStringLiteral(Tree<String> literal) { this.literal = string(literal); this.drop = true; }
+                public String toString() { return "\""+StringUtil.escapify(literal, "\"\r\n\\")+"\""; }
+            }
+            public static class MetaNonterminalReference extends MetaClause {
+                public String name;
+                public MetaNonterminalReference(Tree<String> name) { this.name = string(name); }
+                public Element build(BuildContext bc) { return bc.build(name); }
+                public String toString() { return name; } 
+            }
+            public static class MetaSelfReference extends MetaClause {
+                public String toString() { return "(*)"; } 
+                public Element build(BuildContext bc) { return new Union("(*)"); /* FIXME */ }
+            }
+            public static class MetaInvert extends MetaClause {
+                public MetaClause element;
+                public MetaInvert(Tree<String> t, MetaConjunct c) { this.element = make(t, c); }
+                public String toString() { return "~"+element; }
+                public Element build(BuildContext bc) { return new Hack(new Invert(new Infer(element.build(bc)))); }
+            }
         }
+
     }
 
     public static void main(String[] args) throws Exception {
@@ -317,7 +384,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";
@@ -333,7 +402,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");
@@ -345,617 +425,4 @@ public class MetaGrammar extends ReflectiveWalker {
         p.flush();
         os.close();
     }
-
-    public static class MyLift {
-        public final String s;
-        public MyLift(String s) { this.s = s; }
-    }
-    public static class MyDrop {
-        public final Object o;
-        public MyDrop(Object o) { this.o = o; }
-    }
-
-    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, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "s", new Tree[] { })})}),
-                                                                                                                                                        new Tree(null, null, new Tree[] { new Tree(null, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=>", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-                                                                                                                                                                                                                                                                                                                                                                                                                                                              new Tree(null, "s", new Tree[] { })})})}),
-                                                                                                                                                                                                                                                                                                                                            new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-                                                                                                                                                                                                                                                                                                                                                                                                                                                              new Tree(null, "s", new Tree[] { })})})})}),
-                                                                                                                                                                                                                                                                                                          new Tree(null, "sify", 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, "sify", 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, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "**", new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { })})})})})})})})})})}),
-                                                                                                                     new Tree(null, "::=", new Tree[] { new Tree(null, "sify", 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, "alternatives", 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, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "r", new Tree[] { })})})}),
-                                                                                                                                                                                                                                                                                                                                                                              new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                new Tree(null, "s", new Tree[] { })})})})})}),
-                                                                                                                                                                                                                                                                                                          new Tree(null, "sify", 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, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "r", new Tree[] { })})}),
-                                                                                                                                                        new Tree(null, null, new Tree[] { new Tree(null, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "care", new Tree[] { new Tree(null, "sify", 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, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                  new Tree(null, "s", new Tree[] { })})})})})}),
-                                                                                                                                                                                                                                                                        new Tree(null, "rewrite", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "care", new Tree[] { new Tree(null, "sify", 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, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "sify", 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, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "$$", new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     new Tree(null, "q", new Tree[] { }),
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     new Tree(null, "u", new Tree[] { }),
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     new Tree(null, "i", new Tree[] { }),
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     new Tree(null, "A", new Tree[] { }),
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     new Tree(null, "l", new Tree[] { }),
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     new Tree(null, "t", new Tree[] { })})})}),
-                                                                                                                                                                                                                                                                                                                                                                                   new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, ">", new Tree[] { })})})}),
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
-                                                                                                                                                                                                                              new Tree(null, "q", new Tree[] { }),
-                                                                                                                                                                                                                              new Tree(null, "u", new Tree[] { }),
-                                                                                                                                                                                                                              new Tree(null, "i", new Tree[] { }),
-                                                                                                                                                                                                                              new Tree(null, "A", new Tree[] { }),
-                                                                                                                                                                                                                              new Tree(null, "l", new Tree[] { }),
-                                                                                                                                                                                                                              new Tree(null, "t", new Tree[] { })})}),
-                                                                                                                                                        new Tree(null, null, new Tree[] { new Tree(null, "alternatives", 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, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "|", new Tree[] { })})})}),
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          new Tree(null, "s", new Tree[] { })})})})})})})})})})})}),
-                                                                                                                                                                                                                                                                                                          new Tree(null, "sify", 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, "::=", new Tree[] { new Tree(null, "sify", 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, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                   new Tree(null, "s", new Tree[] { })})})})})})})}),
-                                                                                                                                                                                          new Tree(null, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                   new Tree(null, "s", new Tree[] { })})})}),
-                                                                                                                                                                                                                                                                                                                                                 new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})}),
-        new Tree(null, "care", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "/", new Tree[] { })})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})})})})})})})}),
-        new Tree(null, "::=", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "E", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "%%", new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "**", new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { })})})})})})})})})})})})})})})})})}),
-        new Tree(null, "::=", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "%%", new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "**", new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { })})})})})})})})})})})})})})})})})}),
-        new Tree(null, "::=", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "s", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})}),
-        new Tree(null, "rewrite", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})}),
-        new Tree(null, "care", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "/", new Tree[] { })})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "sify", 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, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "i", new Tree[] { }),
-        new Tree(null, "t", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { })})})})})}),
-        new Tree(null, "rewrite", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "i", new Tree[] { }),
-        new Tree(null, "t", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, "care", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "&", new Tree[] { })})})}),
-        new Tree(null, "%%", new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})}),
-        new Tree(null, "rewrite", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "i", new Tree[] { }),
-        new Tree(null, "t", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, "care", new Tree[] { new Tree(null, "sify", 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, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "i", new Tree[] { }),
-        new Tree(null, "t", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { })})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "alternatives", 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, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})}),
-        new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "i", new Tree[] { }),
-        new Tree(null, "t", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, "rewrite", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "care", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=", new Tree[] { }),
-        new Tree(null, ">", new Tree[] { })})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})}),
-        new Tree(null, "rewrite", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "care", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=", new Tree[] { }),
-        new Tree(null, ">", new Tree[] { })})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "/", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=", new Tree[] { }),
-        new Tree(null, ">", new Tree[] { })})})}),
-        new Tree(null, "literal", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { }),
-        new Tree(null, ")", new Tree[] { })})})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})}),
-        new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "p", new Tree[] { })})})})})})})}),
-        new Tree(null, "::=", new Tree[] { new Tree(null, "sify", 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, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "range", new Tree[] { new Tree(null, "~", new Tree[] { }),
-        new Tree(null, null, new Tree[] { new Tree(null, "range0", new Tree[] { new Tree(null, "-", new Tree[] { })}),
-        new Tree(null, "range0", new Tree[] { new Tree(null, "]", new Tree[] { })}),
-        new Tree(null, "range0", new Tree[] { new Tree(null, "\\", new Tree[] { })}),
-        new Tree(null, "range0", new Tree[] { new Tree(null, "~", new Tree[] { })})})})})}),
-        new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "sify", 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, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=>", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "c", new Tree[] { })})})})}),
-        new Tree(null, "sify", 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, "0", new Tree[] { })})})}),
-        new Tree(null, "=>", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "c", new Tree[] { })})})}),
-        new Tree(null, "care", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "-", new Tree[] { })})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "c", new Tree[] { })})})})}),
-        new Tree(null, "sify", 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, "1", new Tree[] { })})})})})})})}),
-        new Tree(null, "::=", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=>", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "sify", 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, "Y", new Tree[] { })})})}),
-        new Tree(null, "=>", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "range", new Tree[] { new Tree(null, null, new Tree[] { }),
-        new Tree(null, null, new Tree[] { new Tree(null, "range0", new Tree[] { new Tree(null, "(", new Tree[] { })})})}),
-        new Tree(null, "range", new Tree[] { new Tree(null, null, new Tree[] { }),
-        new Tree(null, null, new Tree[] { new Tree(null, "range0", new Tree[] { new Tree(null, ")", new Tree[] { })})})})}),
-        new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "p", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { }),
-        new Tree(null, "i", new Tree[] { }),
-        new Tree(null, "l", new Tree[] { }),
-        new Tree(null, "o", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { })})})}),
-        new Tree(null, "rewrite", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "care", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "{", new Tree[] { })})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "}", new Tree[] { })})})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "literal", new Tree[] { new Tree(null, "sify", 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, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "*", new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "]", new Tree[] { })})})})}),
-        new Tree(null, "sify", 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, "=>", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, "sify", 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, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "*", new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "]", new Tree[] { })})})})}),
-        new Tree(null, "sify", 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, "x", new Tree[] { })})})}),
-        new Tree(null, "rewrite", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, "care", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "%", new Tree[] { }),
-        new Tree(null, "%", new Tree[] { })})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})}),
-        new Tree(null, "rewrite", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, "care", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "$", new Tree[] { }),
-        new Tree(null, "$", new Tree[] { })})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})}),
-        new Tree(null, "rewrite", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, "care", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "?", new Tree[] { })})})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})}),
-        new Tree(null, "rewrite", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, "care", new Tree[] { new Tree(null, "sify", 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, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})}),
-        new Tree(null, "rewrite", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, "care", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "-", new Tree[] { })})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})}),
-        new Tree(null, "rewrite", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "care", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "!", new Tree[] { })})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "/", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "^", new Tree[] { })})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})}),
-        new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "c", new Tree[] { }),
-        new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, "rewrite", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "care", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "`", new Tree[] { })})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})}),
-        new Tree(null, "rewrite", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, "care", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "#", new Tree[] { })})})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "sify", 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, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})}),
-        new Tree(null, "care", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "*", new Tree[] { }),
-        new Tree(null, "*", new Tree[] { })})})})})})})}),
-        new Tree(null, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})}),
-        new Tree(null, "care", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "*", new Tree[] { })})})})})})})})})})})}),
-        new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})}),
-        new Tree(null, "care", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "+", new Tree[] { }),
-        new Tree(null, "+", new Tree[] { })})})})})})})}),
-        new Tree(null, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})}),
-        new Tree(null, "care", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "+", new Tree[] { })})})})})})})})})})})}),
-        new Tree(null, "rewrite", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { })})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "care", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, ")", new Tree[] { })})})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})})})}),
-        new Tree(null, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "care", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { })})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, ")", new Tree[] { })})})})}),
-        new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { })})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, " ", new Tree[] { })})})})})}),
-        new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, "sify", 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, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "*", new Tree[] { new Tree(null, "range", new Tree[] { new Tree(null, "~", new Tree[] { }),
-        new Tree(null, null, new Tree[] { new Tree(null, "range0", new Tree[] { new Tree(null, "\n", new Tree[] { })})})})})})})})})})}),
-        new Tree(null, "literal", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\n", new Tree[] { })})})})})}),
-        new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\n", new Tree[] { })})})})})}),
-        new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\r", new Tree[] { })})})})})})})})})}),
-        new Tree(null, "::=", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { })})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "range", new Tree[] { new Tree(null, 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, "range0", new Tree[] { new Tree(null, "_", new Tree[] { })})})})})})})})})}),
-        new Tree(null, "::=", new Tree[] { new Tree(null, "sify", 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, "alternatives", 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, "nonTerminalY", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { })})})})})}),
-        new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "s", new Tree[] { }),
-        new Tree(null, "i", new Tree[] { }),
-        new Tree(null, "f", new Tree[] { }),
-        new Tree(null, "y", new Tree[] { })})})})})})})}),
-        new Tree(null, "::=", new Tree[] { new Tree(null, "sify", 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, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=>", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, "sify", 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, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", 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, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "range", new Tree[] { new Tree(null, "~", new Tree[] { }),
-        new Tree(null, null, new Tree[] { new Tree(null, "range0", new Tree[] { new Tree(null, "\"", new Tree[] { })}),
-        new Tree(null, "range0", new Tree[] { new Tree(null, "\\", new Tree[] { })})})})})}),
-        new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminalY", new Tree[] { new Tree(null, "sify", 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, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\"", new Tree[] { })})})})}),
-        new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "s", new Tree[] { }),
-        new Tree(null, "i", new Tree[] { }),
-        new Tree(null, "f", new Tree[] { }),
-        new Tree(null, "y", new Tree[] { })})})})})})})}),
-        new Tree(null, "::=", new Tree[] { new Tree(null, "sify", 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, "alternatives", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=>", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\\", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { })})})})}),
-        new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\n", new Tree[] { })})})}),
-        new Tree(null, "=>", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\\", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { })})})})}),
-        new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\r", new Tree[] { })})})}),
-        new Tree(null, "rewrite", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, "sify", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\\", new Tree[] { })})})}),
-        new Tree(null, "range", new Tree[] { new Tree(null, "~", new Tree[] { }),
-        new Tree(null, null, new Tree[] { new Tree(null, "range0", new Tree[] { new Tree(null, "n", new Tree[] { })}),
-        new Tree(null, "range0", new Tree[] { new Tree(null, "r", new Tree[] { })})})})})})})})})})})}),
-        new Tree(null, null, new Tree[] { })})
-        // DO NOT EDIT STUFF ABOVE: IT IS AUTOMATICALLY GENERATED
-        ;
 }
-
-
-
-
-
-
-
-
-
-
-
-
-