added arbitrary expression inversion, lookforward, and syntax for lookback
authoradam <adam@megacz.com>
Mon, 2 Jan 2006 05:38:46 +0000 (00:38 -0500)
committeradam <adam@megacz.com>
Mon, 2 Jan 2006 05:38:46 +0000 (00:38 -0500)
darcs-hash:20060102053846-5007d-1a809fad56c9ef6fd554fca18f7067b3ff5d5c0b.gz

src/edu/berkeley/sbp/Atom.java
src/edu/berkeley/sbp/Repeat.java
src/edu/berkeley/sbp/Sequence.java
src/edu/berkeley/sbp/misc/CharToken.java
src/edu/berkeley/sbp/misc/MetaGrammar.java
src/edu/berkeley/sbp/misc/StringToken.java
tests/meta.g
tests/regression.tc
tests/tibdoc.g

index 037dfaa..61f120d 100644 (file)
@@ -10,38 +10,52 @@ import edu.berkeley.sbp.*;
 /** an element which matches exactly one input token */
 public abstract class Atom<T extends Token> extends Element implements Topology<T> {
 
 /** an element which matches exactly one input token */
 public abstract class Atom<T extends Token> extends Element implements Topology<T> {
 
-    private final Topology<T> rt;
-
-    public Atom(Topology<T> rt) { this.rt = rt; }
+    protected abstract Topology<T> top();
 
     void reachable(HashSet<Sequence.Position> h) { /* do-nothing */ }
 
     public Topology toAtom() { return dup(); }
 
     /** equality is based on the underlying <tt>Topology</tt> */
 
     void reachable(HashSet<Sequence.Position> h) { /* do-nothing */ }
 
     public Topology toAtom() { return dup(); }
 
     /** equality is based on the underlying <tt>Topology</tt> */
-    public int hashCode() { return rt.hashCode(); }
+    public int hashCode() { return top().hashCode(); }
     
     /** equality is based on the underlying <tt>Topology</tt> */
     
     /** equality is based on the underlying <tt>Topology</tt> */
-    public boolean equals(Object o) { return o != null && o instanceof Atom && ((Atom)o).rt.equals(rt); }
+    public boolean equals(Object o) { return o != null && o instanceof Atom && ((Atom)o).top().equals(top()); }
 
     /** declared abstract to force subclasses to override it in a useful manner */
     public abstract String toString();
 
     // Topology Thunks //////////////////////////////////////////////////////////////////////////////
 
 
     /** declared abstract to force subclasses to override it in a useful manner */
     public abstract String toString();
 
     // Topology Thunks //////////////////////////////////////////////////////////////////////////////
 
-    public void              add(Topology<T> t)         { rt.add(t); }
-    public void              add(T t)                   { rt.add(t); }
-    public void              remove(Topology<T> t)      { rt.remove(t); }
-    public void              remove(T t)                { rt.remove(t); }
-    public Topology<T>       dup()                      { return rt.dup(); }
-    public boolean           contains(T v)              { return rt.contains(v); }
-    public Topology<T>       fresh()                    { return rt.fresh(); }
-    public Topology<T>       intersect(Topology<T> t)   { return rt.intersect(t); }
-    public Topology<T>       minus(Topology<T> t)       { return rt.minus(t); }
-    public Topology<T>       union(Topology<T> t)       { return rt.union(t); }
-    public Topology<T>       complement()               { return rt.complement(); }
-    public boolean           disjoint(Topology<T> t)    { return rt.disjoint(t); }
-    public boolean           containsAll(Topology<T> t) { return rt.containsAll(t); }
+    public void              add(Topology<T> t)         { top().add(t); }
+    public void              add(T t)                   { top().add(t); }
+    public void              remove(Topology<T> t)      { top().remove(t); }
+    public void              remove(T t)                { top().remove(t); }
+    public Topology<T>       dup()                      { return top().dup(); }
+    public boolean           contains(T v)              { return top().contains(v); }
+    public Topology<T>       fresh()                    { return top().fresh(); }
+    public Topology<T>       intersect(Topology<T> t)   { return top().intersect(t); }
+    public Topology<T>       minus(Topology<T> t)       { return top().minus(t); }
+    public Topology<T>       union(Topology<T> t)       { return top().union(t); }
+    public Topology<T>       complement()               { return top().complement(); }
+    public boolean           disjoint(Topology<T> t)    { return top().disjoint(t); }
+    public boolean           containsAll(Topology<T> t) { return top().containsAll(t); }
+
+    // Subclasses //////////////////////////////////////////////////////////////////////////////
+
+    public static class Infer<T extends Token> extends Atom<T> {
+        private final Element e;
+        public Infer(Element e) { this.e = e; }
+        public Topology<T> top() { return (Topology<T>)e.toAtom(); }
+        public String toString() { return e.toString(); }
+    }
+    
+    public static class Invert<T extends Token> extends Atom<T> {
+        private final Atom<T> a;
+        public Invert(Atom<T> a) { this.a = a; }
+        public Topology<T> top() { return ((Topology<T>)a.top()).complement(); }
+        public String toString() { return "~"+a; }
+    }
     
 }
 
     
 }
 
index bc6626a..3e9b2b6 100644 (file)
@@ -20,6 +20,7 @@ public class Repeat extends Union {
     public  static Repeat many1(Element e)              { return new Repeat(e, false, true); }
     /** repeat one or more times, separated by <tt>sep</tt> */
     public  static Repeat many1(Element e, Element sep) { return new Repeat(e, false, true, sep); }
     public  static Repeat many1(Element e)              { return new Repeat(e, false, true); }
     /** repeat one or more times, separated by <tt>sep</tt> */
     public  static Repeat many1(Element e, Element sep) { return new Repeat(e, false, true, sep); }
+
     /** repeat zero or more times, matching a maximal sequence of atoms */
     public  static Repeat maximal0(Element e)              { return new Repeat(e, true, true, null, true); }
     /** repeat one or more times, matching a maximal sequence of atoms */
     /** repeat zero or more times, matching a maximal sequence of atoms */
     public  static Repeat maximal0(Element e)              { return new Repeat(e, true, true, null, true); }
     /** repeat one or more times, matching a maximal sequence of atoms */
@@ -43,24 +44,18 @@ public class Repeat extends Union {
         this.zeroOkay = zeroOkay;
         this.manyOkay = manyOkay;
         this.separator = separator;
         this.zeroOkay = zeroOkay;
         this.manyOkay = manyOkay;
         this.separator = separator;
-        Union who = this;
-        if (maximal) {
-            who = new Union(this+"++");
-            add(new Sequence.Singleton(who, null, null) {
-                    public Topology noFollow() { return separator==null ? e.toAtom() : separator.toAtom(); }
-                });
-        }
         if (zeroOkay) {
         if (zeroOkay) {
-            who.add(new Sequence.Constant.Empty());
-            if (manyOkay) who.add(new Sequence.Singleton(many1(e, separator), null, null));
-            else          who.add(new Sequence.Singleton(e, null, null));
+            add(new Sequence.Constant.Empty());
+            if (manyOkay) add(new Sequence.Singleton(many1(e, separator), null, null));
+            else          add(new Sequence.Singleton(e, null, null));
         } else {
         } else {
-            who.add(new Sequence.RewritingSequence(null, new Element[] { e }, null, null));
+            add(new Sequence.RewritingSequence(null, new Element[] { e }, null, null));
             if (this.separator==null) {
             if (this.separator==null) {
-                who.add(new Sequence.Unwrap(new Element[] { e,                 Repeat.this }, null, null));
+                add(new Sequence.Unwrap(new Element[] { e,                 Repeat.this }, null, null));
             } else {
             } else {
-                who.add(new Sequence.Unwrap(new Element[] { e, this.separator, Repeat.this }, new boolean[] { false, true, false }, null, null));
+                add(new Sequence.Unwrap(new Element[] { e, this.separator, Repeat.this }, new boolean[] { false, true, false }, null, null));
             }
         }
             }
         }
+        if (maximal) for(Sequence s : this) s.noFollow = separator==null ? e : separator;
     }
 }
     }
 }
index d252604..e18f5ef 100644 (file)
@@ -35,7 +35,8 @@ public abstract class Sequence extends Element implements Iterable<Element> {
 
     ////////////////////////////////////////////////////////////////////////////////
 
 
     ////////////////////////////////////////////////////////////////////////////////
 
-    public Topology noFollow() { return null; }
+    public Element noFollow = null;
+    public final Topology noFollow() { return noFollow==null ? null : noFollow.toAtom(); }
 
     Topology toAtom() {
         if (elements.length!=1) throw new RuntimeException("cannot invoke toAtom() on a Sequence with " + elements.length + " elements: " + this);
 
     Topology toAtom() {
         if (elements.length!=1) throw new RuntimeException("cannot invoke toAtom() on a Sequence with " + elements.length + " elements: " + this);
index 02c67e9..143c708 100644 (file)
@@ -15,7 +15,9 @@ public class CharToken implements Token, IntegerTopology.IntegerMappable {
 
     public static class CharRange extends Atom<CharToken> {
         private String esc(char c) { return StringUtil.escapify(c+"", "[]-~\\\"\'"); }
 
     public static class CharRange extends Atom<CharToken> {
         private String esc(char c) { return StringUtil.escapify(c+"", "[]-~\\\"\'"); }
-        public CharRange(Topology<CharToken> t) { super(t); }
+        private Topology<CharToken> t;
+        public CharRange(Topology<CharToken> t) { this.t = t; }
+        public Topology<CharToken> top() { return t; }
         public String toString() {
             StringBuffer sb = new StringBuffer();
             sb.append('[');
         public String toString() {
             StringBuffer sb = new StringBuffer();
             sb.append('[');
@@ -52,8 +54,8 @@ public class CharToken implements Token, IntegerTopology.IntegerMappable {
 
     public static CharToken left(int row, int col) { return new CharToken((char)9998, 0, 0) { public String toString() { return "{"; } }; }
     public static CharToken right(int row, int col) { return new CharToken((char)9999, 0, 0) { public String toString() { return "}"; } }; }
 
     public static CharToken left(int row, int col) { return new CharToken((char)9998, 0, 0) { public String toString() { return "{"; } }; }
     public static CharToken right(int row, int col) { return new CharToken((char)9999, 0, 0) { public String toString() { return "}"; } }; }
-    public static final Atom leftBrace  = new Atom(new IntegerTopology<CharToken>(9998)) { public String toString() { return "{"; } };
-    public static final Atom rightBrace = new Atom(new IntegerTopology<CharToken>(9999)) { public String toString() { return "}"; } };
+    public static final Atom leftBrace  = new CharRange(new IntegerTopology<CharToken>(9998)) { public String toString() { return "{"; } };
+    public static final Atom rightBrace = new CharRange(new IntegerTopology<CharToken>(9999)) { public String toString() { return "}"; } };
 
     private static final Range.Set all = new Range.Set(new Range(0, Character.MAX_VALUE));
     public  static final Atom      any = new CharRange(new IntegerTopology<CharToken>(all));
 
     private static final Range.Set all = new Range.Set(new Range(0, Character.MAX_VALUE));
     public  static final Atom      any = new CharRange(new IntegerTopology<CharToken>(all));
index 85b17ee..fee813d 100644 (file)
@@ -115,7 +115,13 @@ public class MetaGrammar extends StringWalker {
         else if ("range".equals(head)) return new Range(walk(tree, 0).toString().charAt(0), walk(tree,0).toString().charAt(0));
         else if ("gram".equals(head)) return walk(tree, 1);
         else if ("=>".equals(head)) { PreSequence p = (PreSequence)walk(tree, 0); p.tag = string(tree.child(1)); return p; }
         else if ("range".equals(head)) return new Range(walk(tree, 0).toString().charAt(0), walk(tree,0).toString().charAt(0));
         else if ("gram".equals(head)) return walk(tree, 1);
         else if ("=>".equals(head)) { PreSequence p = (PreSequence)walk(tree, 0); p.tag = string(tree.child(1)); return p; }
+        else if ("psy".equals(head)) return (PreSequence)walk(tree, 0);
+        else if ("psyl".equals(head)) throw new Error("not supported");
+        else if ("psyr".equals(head)) { PreSequence p = (PreSequence)walk(tree, 0); p.noFollow = (Element)walk(tree, 1); return p; }
+        else if ("psylr".equals(head)) throw new Error("not supported");
         else if ("/".equals(head)) return ((PreSequence)walk(tree, 0)).sparse((Element)walk(tree, 1));
         else if ("/".equals(head)) return ((PreSequence)walk(tree, 0)).sparse((Element)walk(tree, 1));
+        else if ("~".equals(head))
+            return new Atom.Invert(new Atom.Infer((Element)walk(tree, 0)));
         else if ("ps".equals(head)) return new PreSequence((Element[])walk(tree, 0));
         else if ("ps".equals(head)) return new PreSequence((Element[])walk(tree, 0));
         else if ("qprod".equals(head)) {
         else if ("ps".equals(head)) return new PreSequence((Element[])walk(tree, 0));
         else if ("ps".equals(head)) return new PreSequence((Element[])walk(tree, 0));
         else if ("qprod".equals(head)) {
@@ -158,6 +164,7 @@ public class MetaGrammar extends StringWalker {
     //////////////////////////////////////////////////////////////////////////////
 
     public class PreSequence {
     //////////////////////////////////////////////////////////////////////////////
 
     public class PreSequence {
+        public Element noFollow = null;
         public final HashSet<Sequence> and  = new HashSet<Sequence>();
         public final HashSet<Sequence> not  = new HashSet<Sequence>();
         public /*final*/ String tag;
         public final HashSet<Sequence> and  = new HashSet<Sequence>();
         public final HashSet<Sequence> not  = new HashSet<Sequence>();
         public /*final*/ String tag;
@@ -237,10 +244,11 @@ public class MetaGrammar extends StringWalker {
                     if (!drops[i])
                         if (idx==-1) idx = i;
                         else throw new Error("multiple non-dropped elements in sequence: " + Sequence.drop(expansion,null,null,false));
                     if (!drops[i])
                         if (idx==-1) idx = i;
                         else throw new Error("multiple non-dropped elements in sequence: " + Sequence.drop(expansion,null,null,false));
-                if (idx != -1) return Sequence.singleton(expansion, idx, and, not);
-                return Sequence.drop(expansion, and, not, false);
+                if (idx != -1) ret = Sequence.singleton(expansion, idx, and, not);
+                else           ret = Sequence.drop(expansion, and, not, false);
             }
             set.add(ret);
             }
             set.add(ret);
+            if (this.noFollow != null) ret.noFollow = this.noFollow;
             return ret;
         }
     }
             return ret;
         }
     }
@@ -303,10 +311,30 @@ public class MetaGrammar extends StringWalker {
 
 
 
 
 
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
         // DO NOT EDIT STUFF BELOW: IT IS AUTOMATICALLY GENERATED
 new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, "grammar", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "s", new Tree[] { })}),
         // DO NOT EDIT STUFF BELOW: IT IS AUTOMATICALLY GENERATED
 new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, "grammar", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "s", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=>", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
+        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=>", new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "g", new Tree[] { }),
         new Tree(null, "r", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "g", new Tree[] { }),
         new Tree(null, "r", new Tree[] { }),
@@ -316,25 +344,24 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, "r", new Tree[] { })})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, "r", new Tree[] { })})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})}),
+        new Tree(null, "s", new Tree[] { })})})})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "g", new Tree[] { }),
         new Tree(null, "r", new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, "m", new Tree[] { })})})})})}),
         new Tree(null, "!::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, "g", new Tree[] { }),
         new Tree(null, "r", new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, "m", new Tree[] { })})})})})}),
         new Tree(null, "!::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "**", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { })})})})})}),
-        new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})}),
+        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "**", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { })})})})})})}),
+        new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "**", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { })})})}),
         new Tree(null, "literal", 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, null, new Tree[] { new Tree(null, "/", new Tree[] { }),
         new Tree(null, "/", new Tree[] { })})}),
-        new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "*", new Tree[] { new Tree(null, "[~", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "range", new Tree[] { new Tree(null, "\n", new Tree[] { })})})})})})})})})}),
+        new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "*", new Tree[] { new Tree(null, "~", new Tree[] { new Tree(null, "[", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "range", new Tree[] { new Tree(null, "\n", new Tree[] { })})})})})})})})})})})}),
         new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\n", new Tree[] { })})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\n", new Tree[] { })})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})})})}),
+        new Tree(null, "s", new Tree[] { })})})})})})})})}),
         new Tree(null, "!::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "p", new Tree[] { })}),
         new Tree(null, "!::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "p", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "++", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { })})})})})})})})}),
+        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "++", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { })})})})})})})})})}),
         new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "g", new Tree[] { }),
         new Tree(null, "r", new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, "::=", 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[] { }),
@@ -342,9 +369,9 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, "m", new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, "r", new Tree[] { })}),
         new Tree(null, "m", new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, "r", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=>", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "+/", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "r", new Tree[] { })})}),
+        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=>", new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "+/", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "r", new Tree[] { })})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})}),
+        new Tree(null, "s", new Tree[] { })})})})})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "g", new Tree[] { }),
         new Tree(null, "r", new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, null, new Tree[] { new Tree(null, "g", new Tree[] { }),
         new Tree(null, "r", new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
@@ -353,7 +380,7 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, "r", new Tree[] { })})})})})}),
         new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "r", new Tree[] { })}),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, "r", new Tree[] { })})})})})}),
         new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "r", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
+        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "r", new Tree[] { }),
         new Tree(null, "d", new Tree[] { })})})}),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "r", new Tree[] { }),
         new Tree(null, "d", new Tree[] { })})})}),
@@ -373,8 +400,8 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})}),
-        new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
+        new Tree(null, "s", new Tree[] { })})})})}),
+        new Tree(null, "psy", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "r", new Tree[] { }),
         new Tree(null, "d", new Tree[] { })})})}),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "r", new Tree[] { }),
         new Tree(null, "d", new Tree[] { })})})}),
@@ -395,7 +422,7 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})})}),
+        new Tree(null, "s", new Tree[] { })})})})})})})}),
         new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "a", new Tree[] { }),
         new Tree(null, "l", new Tree[] { }),
         new Tree(null, "t", new Tree[] { }),
         new Tree(null, "::=", 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[] { }),
@@ -408,7 +435,7 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, "v", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })}),
         new Tree(null, "v", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "+/", new Tree[] { new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "+/", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "c", new Tree[] { }),
+        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "+/", new Tree[] { new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "+/", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "c", new Tree[] { }),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "n", new Tree[] { }),
         new Tree(null, "j", new Tree[] { }),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "n", new Tree[] { }),
         new Tree(null, "j", new Tree[] { }),
@@ -417,16 +444,16 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, "c", new Tree[] { }),
         new Tree(null, "t", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})}),
         new Tree(null, "c", new Tree[] { }),
         new Tree(null, "t", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})}),
-        new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
+        new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})}),
         new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "|", new Tree[] { })})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})}),
         new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "|", new Tree[] { })})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})})})})})})})})})}),
-        new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
+        new Tree(null, "s", new Tree[] { })})})})})})})})})})})})})})})}),
+        new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})}),
         new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, ">", new Tree[] { })})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})}),
         new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, ">", new Tree[] { })})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})})})})})})})})})}),
+        new Tree(null, "s", new Tree[] { })})})})})})})})})})})})})})})}),
         new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "c", new Tree[] { }),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "n", new Tree[] { }),
         new Tree(null, "::=", 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[] { }),
@@ -436,15 +463,15 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, "c", new Tree[] { }),
         new Tree(null, "t", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })}),
         new Tree(null, "c", new Tree[] { }),
         new Tree(null, "t", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "s", new Tree[] { }),
+        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "s", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "q", new Tree[] { }),
         new Tree(null, "u", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "n", new Tree[] { }),
         new Tree(null, "c", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "q", new Tree[] { }),
         new Tree(null, "u", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "n", new Tree[] { }),
         new Tree(null, "c", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { })})})})}),
-        new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "s", new Tree[] { }),
+        new Tree(null, "e", new Tree[] { })})})})})}),
+        new Tree(null, "psy", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "s", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "q", new Tree[] { }),
         new Tree(null, "u", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "q", new Tree[] { }),
         new Tree(null, "u", new Tree[] { }),
@@ -457,8 +484,8 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})}),
-        new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "s", new Tree[] { }),
+        new Tree(null, "s", new Tree[] { })})})})}),
+        new Tree(null, "psy", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "s", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "q", new Tree[] { }),
         new Tree(null, "u", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "q", new Tree[] { }),
         new Tree(null, "u", new Tree[] { }),
@@ -472,19 +499,19 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})})}),
+        new Tree(null, "s", new Tree[] { })})})})})})})}),
         new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })}),
         new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=>", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "*/", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})}),
+        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=>", new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "*/", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})}),
+        new Tree(null, "s", new Tree[] { })})})})})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})}),
         new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})}),
-        new Tree(null, "=>", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "?", new Tree[] { new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "+/", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})}),
+        new Tree(null, "=>", new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "?", new Tree[] { new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "+/", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})})})})}),
+        new Tree(null, "s", new Tree[] { })})})})})})})})})}),
         new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "^", new Tree[] { })})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "q", new Tree[] { }),
         new Tree(null, "u", new Tree[] { }),
         new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "^", new Tree[] { })})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "q", new Tree[] { }),
         new Tree(null, "u", new Tree[] { }),
@@ -492,51 +519,76 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, "t", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "d", new Tree[] { })})}),
         new Tree(null, "t", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "d", new Tree[] { })})}),
-        new Tree(null, "?", new Tree[] { new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
+        new Tree(null, "?", new Tree[] { new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})}),
         new Tree(null, "+/", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})}),
         new Tree(null, "+/", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})})})})})})})}),
+        new Tree(null, "s", new Tree[] { })})})})})})})})})})})})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
         new Tree(null, "s", new Tree[] { }),
         new Tree(null, "2", new Tree[] { })})})})})}),
         new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
         new Tree(null, "s", new Tree[] { }),
         new Tree(null, "y", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
         new Tree(null, "s", new Tree[] { }),
         new Tree(null, "2", new Tree[] { })})})})})}),
         new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
         new Tree(null, "s", new Tree[] { }),
         new Tree(null, "y", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})}),
-        new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
+        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
+        new Tree(null, "s", new Tree[] { })})})})})}),
+        new Tree(null, "psy", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "p", new Tree[] { })})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "/", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})}),
         new Tree(null, "s", new Tree[] { })})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "p", new Tree[] { })})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "/", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})}),
-        new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})})})})})}),
+        new Tree(null, "nonTerminal", 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, "p", new Tree[] { }),
         new Tree(null, "s", new Tree[] { }),
         new Tree(null, "x", new Tree[] { })}),
         new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
         new Tree(null, "s", new Tree[] { }),
         new Tree(null, "x", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
+        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=>", new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
         new Tree(null, "s", new Tree[] { }),
         new Tree(null, "s", new Tree[] { }),
-        new Tree(null, "y", new Tree[] { })})})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "?", new Tree[] { }),
-        new Tree(null, "=", new Tree[] { }),
-        new Tree(null, ">", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})})}),
+        new Tree(null, "y", new Tree[] { })})})})})}),
+        new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
+        new Tree(null, "s", new Tree[] { }),
+        new Tree(null, "y", new Tree[] { })})}),
+        new Tree(null, "=>", new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})}),
+        new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "<", new Tree[] { }),
+        new Tree(null, "-", new Tree[] { })})}),
+        new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
+        new Tree(null, "s", new Tree[] { }),
+        new Tree(null, "y", new Tree[] { })})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})}),
-        new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
+        new Tree(null, "s", new Tree[] { })})})})}),
+        new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
         new Tree(null, "s", new Tree[] { }),
         new Tree(null, "s", new Tree[] { }),
-        new Tree(null, "y", new Tree[] { })})})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "!", new Tree[] { }),
-        new Tree(null, "=", new Tree[] { }),
-        new Tree(null, ">", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})})}),
+        new Tree(null, "y", new Tree[] { }),
+        new Tree(null, "l", new Tree[] { })})}),
+        new Tree(null, "=>", new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
+        new Tree(null, "s", new Tree[] { }),
+        new Tree(null, "y", new Tree[] { })})}),
+        new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "-", new Tree[] { }),
+        new Tree(null, ">", new Tree[] { })})}),
+        new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})})})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
+        new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
         new Tree(null, "s", new Tree[] { }),
         new Tree(null, "s", new Tree[] { }),
-        new Tree(null, "y", new Tree[] { })})})})})})})}),
+        new Tree(null, "y", new Tree[] { }),
+        new Tree(null, "r", new Tree[] { })})}),
+        new Tree(null, "=>", new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})}),
+        new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "<", new Tree[] { }),
+        new Tree(null, "-", new Tree[] { })})}),
+        new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
+        new Tree(null, "s", new Tree[] { }),
+        new Tree(null, "y", new Tree[] { })})}),
+        new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "-", new Tree[] { }),
+        new Tree(null, ">", new Tree[] { })})}),
+        new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})})}),
+        new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
+        new Tree(null, "s", new Tree[] { })})})})}),
+        new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
+        new Tree(null, "s", new Tree[] { }),
+        new Tree(null, "y", new Tree[] { }),
+        new Tree(null, "l", new Tree[] { }),
+        new Tree(null, "r", new Tree[] { })})})})})}),
         new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "s", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "q", new Tree[] { }),
         new Tree(null, "::=", 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[] { }),
@@ -545,72 +597,71 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, "n", new Tree[] { }),
         new Tree(null, "c", new Tree[] { }),
         new Tree(null, "e", new Tree[] { })}),
         new Tree(null, "n", new Tree[] { }),
         new Tree(null, "c", new Tree[] { }),
         new Tree(null, "e", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=>", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "q", new Tree[] { }),
+        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=>", new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "q", new Tree[] { }),
         new Tree(null, "u", new Tree[] { }),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "t", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "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, "d", new Tree[] { })})})})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "q", new Tree[] { }),
         new Tree(null, "p", new Tree[] { }),
         new Tree(null, "r", new Tree[] { }),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "d", new Tree[] { })})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "q", new Tree[] { }),
         new Tree(null, "p", new Tree[] { }),
         new Tree(null, "r", new Tree[] { }),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "d", new Tree[] { })})})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
+        new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
         new Tree(null, "s", new Tree[] { }),
         new Tree(null, "s", new Tree[] { }),
-        new Tree(null, "x", new Tree[] { })})})})}),
-        new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
+        new Tree(null, "x", new Tree[] { })})})})})}),
+        new Tree(null, "psy", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "p", new Tree[] { }),
         new Tree(null, "s", new Tree[] { }),
         new Tree(null, "x", new Tree[] { })})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "=", new Tree[] { }),
         new Tree(null, ">", new Tree[] { })}),
         new Tree(null, "s", new Tree[] { }),
         new Tree(null, "x", new Tree[] { })})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "=", new Tree[] { }),
         new Tree(null, ">", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
+        new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "r", new Tree[] { }),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "d", new Tree[] { })})})})}),
-        new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "q", new Tree[] { }),
+        new Tree(null, "d", new Tree[] { })})})})})}),
+        new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "q", new Tree[] { }),
         new Tree(null, "u", new Tree[] { }),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "t", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "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, "d", new Tree[] { })})})})})})})})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})})}),
+        new Tree(null, "s", new Tree[] { })})})})})})})}),
         new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
         new Tree(null, "c", new Tree[] { })}),
         new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
         new Tree(null, "c", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "[~", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "range", new Tree[] { new Tree(null, "-", new Tree[] { })}),
+        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "~", new Tree[] { new Tree(null, "[", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "range", new Tree[] { new Tree(null, "-", new Tree[] { })}),
         new Tree(null, "range", new Tree[] { new Tree(null, "]", new Tree[] { })}),
         new Tree(null, "range", new Tree[] { new Tree(null, "]", new Tree[] { })}),
-        new Tree(null, "range", new Tree[] { new Tree(null, "\\", new Tree[] { })}),
-        new Tree(null, "range", new Tree[] { new Tree(null, "~", new Tree[] { })})})})})}),
-        new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
+        new Tree(null, "range", new Tree[] { new Tree(null, "\\", new Tree[] { })})})})})})})}),
+        new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
         new Tree(null, "s", new Tree[] { }),
         new Tree(null, "c", new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, "p", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "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, "d", new Tree[] { })})})})})})})})}),
         new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "r", new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, "n", new Tree[] { }),
         new Tree(null, "g", new Tree[] { }),
         new Tree(null, "e", new Tree[] { })}),
         new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "r", new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, "n", new Tree[] { }),
         new Tree(null, "g", new Tree[] { }),
         new Tree(null, "e", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=>", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "c", new Tree[] { })})})})}),
+        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=>", new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
+        new Tree(null, "c", new Tree[] { })})})})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "r", new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, "n", new Tree[] { }),
         new Tree(null, "g", new Tree[] { }),
         new Tree(null, "e", new Tree[] { })})}),
         new Tree(null, null, new Tree[] { new Tree(null, "r", new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, "n", new Tree[] { }),
         new Tree(null, "g", new Tree[] { }),
         new Tree(null, "e", new Tree[] { })})}),
-        new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
+        new Tree(null, "psy", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
         new Tree(null, "c", new Tree[] { })})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "-", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
         new Tree(null, "c", new Tree[] { })})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "-", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "c", new Tree[] { })})})})})})})}),
+        new Tree(null, "c", new Tree[] { })})})})})})})})}),
         new Tree(null, "::=", 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, "e", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=>", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
+        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=>", new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "r", new Tree[] { }),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "d", new Tree[] { })})})})}),
+        new Tree(null, "d", new Tree[] { })})})})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "n", new Tree[] { }),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "n", new Tree[] { }),
         new Tree(null, null, new Tree[] { new Tree(null, "n", new Tree[] { }),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "n", new Tree[] { }),
@@ -622,12 +673,12 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, "n", new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, "l", new Tree[] { })})}),
         new Tree(null, "n", new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, "l", new Tree[] { })})}),
-        new Tree(null, "=>", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "q", new Tree[] { }),
+        new Tree(null, "=>", new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "q", new Tree[] { }),
         new Tree(null, "u", new Tree[] { }),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "t", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "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, "d", new Tree[] { })})})})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "l", new Tree[] { }),
         new Tree(null, "i", new Tree[] { }),
         new Tree(null, "t", new Tree[] { }),
         new Tree(null, null, new Tree[] { new Tree(null, "l", new Tree[] { }),
         new Tree(null, "i", new Tree[] { }),
         new Tree(null, "t", new Tree[] { }),
@@ -635,11 +686,11 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, "r", new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, "l", new Tree[] { })})}),
         new Tree(null, "r", new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, "l", new Tree[] { })})}),
-        new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { }),
+        new Tree(null, "psy", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { }),
         new Tree(null, ")", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { }),
         new Tree(null, ")", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { })}),
-        new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { }),
+        new Tree(null, null, new Tree[] { })})}),
+        new Tree(null, "psy", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, null, new Tree[] { new Tree(null, "{", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "s", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, null, new Tree[] { new Tree(null, "{", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "s", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
@@ -651,78 +702,69 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, "e", new Tree[] { })})}),
         new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "}", new Tree[] { })})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "e", new Tree[] { })})}),
         new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "}", new Tree[] { })})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})}),
-        new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { }),
+        new Tree(null, "s", new Tree[] { })})})})}),
+        new Tree(null, "psy", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, null, new Tree[] { new Tree(null, "[", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, "*", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "r", new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, "n", new Tree[] { }),
         new Tree(null, "g", new Tree[] { }),
         new Tree(null, "e", new Tree[] { })})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "[", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, "*", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "r", new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, "n", new Tree[] { }),
         new Tree(null, "g", new Tree[] { }),
         new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "]", new Tree[] { })})})})}),
-        new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { }),
-        new Tree(null, null, new Tree[] { new Tree(null, "[", new Tree[] { }),
-        new Tree(null, "~", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, "*", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "r", new Tree[] { }),
-        new Tree(null, "a", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { }),
-        new Tree(null, "g", new Tree[] { }),
-        new Tree(null, "e", new Tree[] { })})})}),
-        new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "]", new Tree[] { })})})})}),
-        new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
+        new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "]", new Tree[] { })})})})})}),
+        new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "+", new Tree[] { }),
         new Tree(null, "+", new Tree[] { })}),
         new Tree(null, null, new Tree[] { })}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, null, new Tree[] { new Tree(null, "+", new Tree[] { }),
         new Tree(null, "+", new Tree[] { })}),
         new Tree(null, null, new Tree[] { })}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", 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, "psy", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "+", new Tree[] { })}),
         new Tree(null, null, new Tree[] { })}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, null, new Tree[] { new Tree(null, "+", new Tree[] { })}),
         new Tree(null, null, new Tree[] { })}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})})})})}),
-        new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
+        new Tree(null, "s", new Tree[] { })})})})})})})})})})}),
+        new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "+", new Tree[] { }),
         new Tree(null, "+", new Tree[] { }),
         new Tree(null, "/", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, null, new Tree[] { new Tree(null, "+", new Tree[] { }),
         new Tree(null, "+", new Tree[] { }),
         new Tree(null, "/", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
+        new Tree(null, "s", new Tree[] { })})})})})}),
+        new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "+", new Tree[] { }),
         new Tree(null, "/", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, null, new Tree[] { new Tree(null, "+", new Tree[] { }),
         new Tree(null, "/", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})})})})}),
-        new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
+        new Tree(null, "s", new Tree[] { })})})})})})})})})})}),
+        new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "*", new Tree[] { }),
         new Tree(null, "*", new Tree[] { })}),
         new Tree(null, null, new Tree[] { })}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, null, new Tree[] { new Tree(null, "*", new Tree[] { }),
         new Tree(null, "*", new Tree[] { })}),
         new Tree(null, null, new Tree[] { })}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", 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, "psy", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "*", new Tree[] { })}),
         new Tree(null, null, new Tree[] { })}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, null, new Tree[] { new Tree(null, "*", new Tree[] { })}),
         new Tree(null, null, new Tree[] { })}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})})})})}),
-        new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
+        new Tree(null, "s", new Tree[] { })})})})})})})})})})}),
+        new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "*", new Tree[] { }),
         new Tree(null, "*", new Tree[] { }),
         new Tree(null, "/", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, null, new Tree[] { new Tree(null, "*", new Tree[] { }),
         new Tree(null, "*", new Tree[] { }),
         new Tree(null, "/", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
+        new Tree(null, "s", new Tree[] { })})})})})}),
+        new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "*", new Tree[] { }),
         new Tree(null, "/", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, null, new Tree[] { new Tree(null, "*", new Tree[] { }),
         new Tree(null, "/", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})})})})}),
-        new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
+        new Tree(null, "s", new Tree[] { })})})})})})})})})})}),
+        new Tree(null, "psy", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "?", new Tree[] { })}),
         new Tree(null, null, new Tree[] { })}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, null, new Tree[] { new Tree(null, "?", new Tree[] { })}),
         new Tree(null, null, new Tree[] { })}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})}),
-        new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { })})}),
+        new Tree(null, "s", new Tree[] { })})})})}),
+        new Tree(null, "psy", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { })})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "r", new Tree[] { }),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "r", new Tree[] { }),
@@ -730,8 +772,8 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, null, new Tree[] { new Tree(null, ")", new Tree[] { })}),
         new Tree(null, null, new Tree[] { })}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, null, new Tree[] { new Tree(null, ")", new Tree[] { })}),
         new Tree(null, null, new Tree[] { })}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})}),
-        new Tree(null, null, new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { }),
+        new Tree(null, "s", new Tree[] { })})})})})}),
+        new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "/", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "a", new Tree[] { }),
         new Tree(null, "l", new Tree[] { }),
         new Tree(null, null, new Tree[] { new Tree(null, "(", new Tree[] { })}),
         new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "a", new Tree[] { }),
         new Tree(null, "l", new Tree[] { }),
@@ -747,41 +789,44 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})}),
         new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, ")", new Tree[] { })})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "s", new Tree[] { })})}),
         new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, ")", new Tree[] { })})})})}),
         new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
-        new Tree(null, "s", new Tree[] { })})})})})})}),
+        new Tree(null, "s", new Tree[] { })})})})}),
+        new Tree(null, "psy", new Tree[] { new Tree(null, "ps2", new Tree[] { new Tree(null, null, new Tree[] { }),
+        new Tree(null, null, new Tree[] { new Tree(null, "~", new Tree[] { })}),
+        new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { })})})})})})})})}),
         new Tree(null, "!::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { })}),
         new Tree(null, "!::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "[", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "range", new Tree[] { new Tree(null, " ", new Tree[] { })}),
-        new Tree(null, "range", new Tree[] { new Tree(null, "\r", new Tree[] { })}),
-        new Tree(null, "range", new Tree[] { new Tree(null, "\n", new Tree[] { })})})})})})})})}),
+        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "qprod", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, " ", new Tree[] { })})}),
+        new Tree(null, "qprod", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\n", new Tree[] { })})}),
+        new Tree(null, "qprod", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\r", new Tree[] { })})})})})}),
         new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "r", new Tree[] { }),
         new Tree(null, "d", new Tree[] { })}),
         new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "r", new Tree[] { }),
         new Tree(null, "d", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "++", new Tree[] { new Tree(null, "[", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "-", new Tree[] { new Tree(null, "a", new Tree[] { }),
+        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "++", new Tree[] { new Tree(null, "[", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "-", new Tree[] { new Tree(null, "a", new Tree[] { }),
         new Tree(null, "z", new Tree[] { })}),
         new Tree(null, "-", new Tree[] { new Tree(null, "A", new Tree[] { }),
         new Tree(null, "Z", new Tree[] { })}),
         new Tree(null, "-", new Tree[] { new Tree(null, "0", new Tree[] { }),
         new Tree(null, "9", new Tree[] { })}),
         new Tree(null, "z", new Tree[] { })}),
         new Tree(null, "-", new Tree[] { new Tree(null, "A", new Tree[] { }),
         new Tree(null, "Z", new Tree[] { })}),
         new Tree(null, "-", new Tree[] { new Tree(null, "0", new Tree[] { }),
         new Tree(null, "9", new Tree[] { })}),
-        new Tree(null, "range", new Tree[] { new Tree(null, "_", new Tree[] { })})})})})})})})})}),
+        new Tree(null, "range", new Tree[] { new Tree(null, "_", new Tree[] { })})})})})})})})})})}),
         new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "q", new Tree[] { }),
         new Tree(null, "u", new Tree[] { }),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "t", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "d", new Tree[] { })}),
         new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "q", new Tree[] { }),
         new Tree(null, "u", new Tree[] { }),
         new Tree(null, "o", new Tree[] { }),
         new Tree(null, "t", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "d", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\"", new Tree[] { })})}),
-        new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "+", new Tree[] { new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "[~", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "range", new Tree[] { new Tree(null, "\"", new Tree[] { })}),
-        new Tree(null, "range", new Tree[] { new Tree(null, "\\", new Tree[] { })})})})})}),
-        new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
+        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\"", new Tree[] { })})}),
+        new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "+", new Tree[] { new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "~", new Tree[] { new Tree(null, "[", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "range", new Tree[] { new Tree(null, "\"", new Tree[] { })}),
+        new Tree(null, "range", new Tree[] { new Tree(null, "\\", new Tree[] { })})})})})})})}),
+        new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
         new Tree(null, "s", new Tree[] { }),
         new Tree(null, "c", new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, "p", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "s", new Tree[] { }),
         new Tree(null, "c", new Tree[] { }),
         new Tree(null, "a", new Tree[] { }),
         new Tree(null, "p", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
-        new Tree(null, "d", new Tree[] { })})})})})})})})})})})})})}),
-        new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\"", new Tree[] { })})})})}),
-        new Tree(null, "=>", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\"", new Tree[] { }),
-        new Tree(null, "\"", new Tree[] { })})})})}),
+        new Tree(null, "d", new Tree[] { })})})})})})})})})})})})})})})}),
+        new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\"", new Tree[] { })})})})})}),
+        new Tree(null, "=>", new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\"", new Tree[] { }),
+        new Tree(null, "\"", new Tree[] { })})})})})}),
         new Tree(null, "", new Tree[] { })})})})}),
         new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
         new Tree(null, "s", new Tree[] { }),
         new Tree(null, "", new Tree[] { })})})})}),
         new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "e", new Tree[] { }),
         new Tree(null, "s", new Tree[] { }),
@@ -790,15 +835,15 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
         new Tree(null, "p", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "d", new Tree[] { })}),
         new Tree(null, "p", new Tree[] { }),
         new Tree(null, "e", new Tree[] { }),
         new Tree(null, "d", new Tree[] { })}),
-        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=>", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\\", new Tree[] { }),
-        new Tree(null, "n", new Tree[] { })})})})}),
+        new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "=>", new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\\", new Tree[] { }),
+        new Tree(null, "n", new Tree[] { })})})})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "\n", new Tree[] { })})}),
         new Tree(null, null, new Tree[] { new Tree(null, "\n", new Tree[] { })})}),
-        new Tree(null, "=>", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\\", new Tree[] { }),
-        new Tree(null, "r", new Tree[] { })})})})}),
+        new Tree(null, "=>", new Tree[] { new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\\", new Tree[] { }),
+        new Tree(null, "r", new Tree[] { })})})})})}),
         new Tree(null, null, new Tree[] { new Tree(null, "\r", new Tree[] { })})}),
         new Tree(null, null, new Tree[] { new Tree(null, "\r", new Tree[] { })})}),
-        new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\\", new Tree[] { })})}),
-        new Tree(null, "[~", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "range", new Tree[] { new Tree(null, "n", new Tree[] { })}),
-        new Tree(null, "range", new Tree[] { new Tree(null, "r", new Tree[] { })})})})})})})})})})}),
+        new Tree(null, "psy", new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\\", new Tree[] { })})}),
+        new Tree(null, "~", new Tree[] { new Tree(null, "[", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "range", new Tree[] { new Tree(null, "n", new Tree[] { })}),
+        new Tree(null, "range", new Tree[] { new Tree(null, "r", new Tree[] { })})})})})})})})})})})})}),
         new Tree(null, null, new Tree[] { })})
         // DO NOT EDIT STUFF ABOVE: IT IS AUTOMATICALLY GENERATED
         ;
         new Tree(null, null, new Tree[] { })})
         // DO NOT EDIT STUFF ABOVE: IT IS AUTOMATICALLY GENERATED
         ;
@@ -852,3 +897,23 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }),
 
 
 
 
 
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
index fac11ab..bab4eff 100644 (file)
@@ -14,13 +14,16 @@ public class StringToken implements Token {
     public static final StringToken left = new StringToken(null, null) { public boolean equals(Object o) { return this==o; } };
     public static final StringToken right = new StringToken(null, null) { public boolean equals(Object o) { return this==o; } };
 
     public static final StringToken left = new StringToken(null, null) { public boolean equals(Object o) { return this==o; } };
     public static final StringToken right = new StringToken(null, null) { public boolean equals(Object o) { return this==o; } };
 
-    public static final Atom leftBrace  = new Atom(new DiscreteTopology<StringToken>(left)) { public String toString() { return "{"; } };
-    public static final Atom rightBrace = new Atom(new DiscreteTopology<StringToken>(right)) { public String toString() { return "}"; } };
+    public static final Atom leftBrace  = new StringAtom(new DiscreteTopology<StringToken>(left)) { public String toString() { return "{"; } };
+    public static final Atom rightBrace = new StringAtom(new DiscreteTopology<StringToken>(right)) { public String toString() { return "}"; } };
 
     private static class StringAtom extends Atom {
         private String s;
 
     private static class StringAtom extends Atom {
         private String s;
-        public StringAtom(String s) { super(new DiscreteTopology<StringToken>(new StringToken(s, null))); this.s = s; }
+        private Topology t;
+        public StringAtom(String s) { this.t = new DiscreteTopology<StringToken>(new StringToken(s, null)); this.s = s; }
+        public StringAtom(Topology<StringToken> t) { this.t = t; }
         public String toString() { return "[atom \""+s+"\"]"; }
         public String toString() { return "[atom \""+s+"\"]"; }
+        public Topology top() { return t; }
     }
 
     /** returns an element which exactly matches the string given */
     }
 
     /** returns an element which exactly matches the string given */
index 2dc0fb9..884f2aa 100644 (file)
@@ -16,14 +16,15 @@ ps         ::= e*/ws                              => "ps"
              | (e+/ws ws)? "^" quoted (ws e+/ws)? => "ps2"
 psy        ::= ps
              | ps wp ^"/" ws e
              | (e+/ws ws)? "^" quoted (ws e+/ws)? => "ps2"
 psy        ::= ps
              | ps wp ^"/" ws e
-psx        ::= psy ^"?=>" e /ws
-             | psy ^"!=>" e /ws
-             > psy
+psx        ::= psy                   => "psy"
+             | e "<-" psy        /ws => "psyl"
+             |        psy "->" e /ws => "psyr"
+             | e "<-" psy "->" e /ws => "psylr"
 sequence   ::= quoted => "qprod"
              > psx
              | psx ^"=>" (word|quoted) /ws
 
 sequence   ::= quoted => "qprod"
              > psx
              | psx ^"=>" (word|quoted) /ws
 
-ec       ::= [~\-\]\\\~]
+ec       ::= ~[\-\]\\]
            | escaped
 
 range    ::= ec          => "range"
            | escaped
 
 range    ::= ec          => "range"
@@ -34,7 +35,6 @@ e        ::=  word                          => "nonTerminal"
            |    ^"()"
            |    ^"{" sequence "}"       /ws
            |    ^"["  range* "]"
            |    ^"()"
            |    ^"{" sequence "}"       /ws
            |    ^"["  range* "]"
-           |    ^"[~" range* "]"
 
            |  (e ^"++"    /ws > e ^"+"    /ws)
            |  (e ^"++/" e /ws > e ^"+/" e /ws)
 
            |  (e ^"++"    /ws > e ^"+"    /ws)
            |  (e ^"++/" e /ws > e ^"+/" e /ws)
@@ -44,14 +44,16 @@ e        ::=  word                          => "nonTerminal"
 
            |     "(" word         ^")"  /ws
            >    ^"(" alternatives  ")"  /ws
 
            |     "(" word         ^")"  /ws
            >    ^"(" alternatives  ")"  /ws
+           |    ^"~" e
+
 w       !::= " "
            | "\n"
            | "\r"
 word     ::= [a-zA-Z0-9_]++
 w       !::= " "
            | "\n"
            | "\r"
 word     ::= [a-zA-Z0-9_]++
-quoted   ::= "\"" (([~\"\\] | escaped)+) "\""
+quoted   ::= "\"" ((~[\"\\] | escaped)+) "\""
            | "\"\"" => ""
 escaped  ::= "\\n" => "\n"
            | "\\r" => "\r"
            | "\"\"" => ""
 escaped  ::= "\\n" => "\n"
            | "\\r" => "\r"
-           | "\\" [~nr]
+           | "\\" ~[nr]
 
 
 
 
index 6dabcb2..863b62e 100644 (file)
@@ -41,8 +41,8 @@ testcase {
     output "1:{{a b} {c}}";
 
     s   ::= ids
     output "1:{{a b} {c}}";
 
     s   ::= ids
-    ids ::= id (" " ids &~ id [~]*) => "1"
-          | id (    ids &~ id [~]*) => "2"
+    ids ::= id (" " ids &~ id ~[]*) => "1"
+          | id (    ids &~ id ~[]*) => "2"
           | id
     id  ::= [a-z]++
 }
           | id
     id  ::= [a-z]++
 }
@@ -284,16 +284,16 @@ testcase {
 
 indent  !::= ww
 outdent !::= " "  outdent " "
 
 indent  !::= ww
 outdent !::= " "  outdent " "
-           | " "  ([~]*)  "\n"
+           | " "  (~[]*)  "\n"
 
 
-any      !::= [~]*
+any      !::= ~[]*
 s         ::= any "\n\n" ww statement ww "\n\n" any => smt
 ww       !::= sp*
 ws       !::= sp**
 sp        ::= " "
 
 block     ::= "\n" indent  blockBody
 s         ::= any "\n\n" ww statement ww "\n\n" any => smt
 ww       !::= sp*
 ws       !::= sp**
 sp        ::= " "
 
 block     ::= "\n" indent  blockBody
-           &~ "\n" outdent [~\ ] [~]*
+           &~ "\n" outdent ~[\ ] ~[]*
 
 blockBody ::= statement
             > statement blockBody /ws => "sbb"
 
 blockBody ::= statement
             > statement blockBody /ws => "sbb"
index 918e80c..1ea798d 100644 (file)
@@ -30,7 +30,7 @@
 // FIXME: these have to go at the top so they have their dropAll bit set before PreSequence.build...
 ws      !::= w**
 w       !::=  [\r\n\ ]
 // FIXME: these have to go at the top so they have their dropAll bit set before PreSequence.build...
 ws      !::= w**
 w       !::=  [\r\n\ ]
-nw       ::= [~\r\n\ ]
+nw       ::= ~[\r\n\ ]
 
 //////////////////////////////////////////////////////////////////////////////
 
 
 //////////////////////////////////////////////////////////////////////////////
 
@@ -55,7 +55,7 @@ Paragraph  ::= { "\"\"" ws text }        => "blockquote"
              > { text }                  => "p"
 
 text       ::= item */ ws
              > { text }                  => "p"
 
 text       ::= item */ ws
-pre        ::= "[verbatim]" { [~]+ } /ws => "verbatim"   // FIXME doesn't work
+pre        ::= "[verbatim]" { ~[]+ } /ws => "verbatim"   // FIXME doesn't work
 item       ::= pre
              > email
              > structured
 item       ::= pre
              > email
              > structured
@@ -100,7 +100,7 @@ port       ::= [0-9]+
 
 domain     ::= part +/ "."
 part       ::= [a-zA-Z0-9\-]++    // interesting use of boolean grammars
 
 domain     ::= part +/ "."
 part       ::= [a-zA-Z0-9\-]++    // interesting use of boolean grammars
-//            &~ ([\-0-9] [~]* | [~]* [\-0-9])
+//            &~ ([\-0-9] ~[]* | ~[]* [\-0-9])
 
 email      ::= username "@" host      => email
 host       ::= [0-9]+ "." [0-9]+ "." [0-9]+ "." [0-9]+ => "ip"
 
 email      ::= username "@" host      => email
 host       ::= [0-9]+ "." [0-9]+ "." [0-9]+ "." [0-9]+ => "ip"
@@ -113,11 +113,11 @@ host       ::= [0-9]+ "." [0-9]+ "." [0-9]+ "." [0-9]+ => "ip"
 word     ::= alphanum++
            | quoted
 
 word     ::= alphanum++
            | quoted
 
-quoted   ::= "\"" (([~\"\\] | escaped)+) "\""
+quoted   ::= "\"" ((~[\"\\] | escaped)+) "\""
            | "\"\"" => ""
 escaped  ::= "\\n" => "\n"
            | "\\r" => "\r"
            | "\"\"" => ""
 escaped  ::= "\\n" => "\n"
            | "\\r" => "\r"
-           | "\\" [~nr]
+           | "\\" ~[nr]
 
 
 // Chars ///////////////////////////////////////////////////////////////
 
 
 // Chars ///////////////////////////////////////////////////////////////
@@ -125,6 +125,6 @@ escaped  ::= "\\n" => "\n"
 alpha    ::= [a-zA-Z]
 num      ::= [0-9]
 alphanum ::= [a-zA-Z0-9]
 alpha    ::= [a-zA-Z]
 num      ::= [0-9]
 alphanum ::= [a-zA-Z0-9]
-sym      ::= [~a-zA-Z0-9\ \r\n]
+sym      ::= ~[a-zA-Z0-9\ \r\n]