use >> and << for indent/dedent
[sbp.git] / src / edu / berkeley / sbp / meta / GrammarAST.java
index ca236e9..997d0b6 100644 (file)
@@ -100,25 +100,28 @@ public class GrammarAST {
             return ret;
         }
         if (head.equals("Quoted")) return stringifyChildren(t);
-        if (head.equals("Literal")) return new LiteralNode((String)walk(t.child(0)));
-        if (head.equals("->")) return arrow((Seq)walk(t.child(0)), (ElementNode)walk(t.child(1)));
-        if (head.equals("DropNT")) return new NonTerminalNode((String)walk(t.child(0)), (Seq[][])walkChildren(t.child(1)), false, null, true);
-        if (head.equals("=") && t.size()==2) return new NonTerminalNode((String)walk(t.child(0)), (Seq[][])walk(t.child(1)), true, null, false);
-        if (head.equals("=")) return new NonTerminalNode((String)walk(t.child(0)), (Seq[][])walk(t.child(2)), true, (String)walk(t.child(1)), false);
-        if (head.equals("&")) return and2((Seq)walk(t.child(0)), (Seq)walk(t.child(1)));
-        if (head.equals("&~")) return andnot2((Seq)walk(t.child(0)), (Seq)walk(t.child(1)));
-        if (head.equals("/")) return ((Seq)walk(t.child(0))).separate((ElementNode)walk(t.child(1)));
-        if (head.equals("()")) return epsilon;
-        if (head.equals("[")) return new AtomNode((AtomNodeRange[])Reflection.rebuild(walkChildren(t), AtomNodeRange[].class));
-        if (head.equals("\\{")) return new DropNode(new AtomNode(new AtomNodeRange(CharAtom.left, CharAtom.left)));
-        if (head.equals("\\}")) return new DropNode(new AtomNode(new AtomNodeRange(CharAtom.right, CharAtom.right)));
-        if (head.equals("~")) return new TildeNode((ElementNode)walk(t.child(0)));
-        if (head.equals("~~")) {
-            Seq seq = new Seq(star(new TildeNode(new AtomNode())));
-            return seq.andnot((Seq)walk(t.child(0)));
-        }
-        if (head.equals("Range") && t.size()==1) return new AtomNodeRange(unescape(t).charAt(0));
-        if (head.equals("Range")) return new AtomNodeRange(unescape(t).charAt(0), unescape(t).charAt(1));
+        if (head.equals("Literal")) return new LiteralNode(walkString(t.child(0)));
+        if (head.equals("->")) return walkSeq(t.child(0)).follow(walkElement(t.child(1)));
+        if (head.equals("DropNT")) return new NonTerminalNode(walkString(t.child(0)), (Seq[][])walkChildren(t.child(1)), false, null, true);
+        if (head.equals("=")) return new NonTerminalNode(walkString(t.child(0)), (Seq[][])walk(t.child(2)),
+                                                         true, t.size()==2 ? null : walkString(t.child(1)), false);
+        if (head.equals("&"))   return and2(walkSeq(t.child(0)), walkSeq(t.child(1)));
+        if (head.equals("&~"))  return andnot2(walkSeq(t.child(0)), walkSeq(t.child(1)));
+        if (head.equals("/"))   return (walkSeq(t.child(0))).separate(walkElement(t.child(1)));
+        if (head.equals("()"))  return new LiteralNode("");
+        if (head.equals("["))   return new AtomNode((char[][])Reflection.rebuild(walkChildren(t), char[][].class));
+        if (head.equals("\\{")) return new DropNode(new AtomNode(new char[] { CharAtom.left, CharAtom.left }));
+        if (head.equals("\\}")) return new DropNode(new AtomNode(new char[] { CharAtom.right, CharAtom.right }));
+        if (head.equals(">>"))  return new DropNode(new AtomNode(new char[] { CharAtom.left, CharAtom.left }));
+        if (head.equals("<<"))  return new DropNode(new AtomNode(new char[] { CharAtom.right, CharAtom.right }));
+        if (head.equals("~"))   return new TildeNode(walkElement(t.child(0)));
+        if (head.equals("~~"))  return new Seq(new RepeatNode(new TildeNode(new AtomNode()), null, true,  true,  false)).andnot(walkSeq(t.child(0)));
+        if (head.equals("Range") && t.size()==2 && ">".equals(t.child(0).head()))
+            return new char[] { CharAtom.left, CharAtom.left };
+        if (head.equals("Range") && t.size()==2 && "<".equals(t.child(0).head()))
+            return new char[] { CharAtom.right, CharAtom.right };
+        if (head.equals("Range") && t.size()==1) return new char[] { unescape(t).charAt(0), unescape(t).charAt(0) };
+        if (head.equals("Range")) return new char[] { unescape(t).charAt(0), unescape(t).charAt(1) };
         if (head.equals("\"\"")) return "";
         if (head.equals("\n")) return "\n";
         if (head.equals("\r")) return "\r";