added ~~ operator and tests for ~~ and ... operators
[sbp.git] / src / edu / berkeley / sbp / meta / GrammarBuilder.java
index f38bd8e..121f480 100644 (file)
@@ -85,9 +85,8 @@ public class GrammarBuilder {
 
     public Object walk(Tree t) {
         String head = (String)t.head();
-        if (head.indexOf('.') != 0)
-            while(head.indexOf('.') != -1)
-                head = head.substring(head.indexOf('.')+1);
+        while(head.indexOf('.') > 0)
+            head = head.substring(head.indexOf('.')+1);
         if (head==null) throw new RuntimeException("head is null: " + t);
         if (head.equals("|")) return walkChildren(t);
         if (head.equals("RHS")) return walkChildren(t);
@@ -130,6 +129,10 @@ public class GrammarBuilder {
         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("\"\"")) return "";