MAJOR: huge revamp of Sequence, Result, Reduction, Parser, Node, GSS
[sbp.git] / src / edu / berkeley / sbp / meta / MetaGrammarBindings.java
index cae45c0..927cd62 100644 (file)
@@ -195,7 +195,7 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings {
         public Seq(ElementNode e) { this(new ElementNode[] { e }); }
         public Seq(ElementNode[] elements) { this.elements = elements; }
         public Atom toAtom(Context cx) {
-            if (elements.length != 1) throw new Error("FIXME");
+            if (elements.length != 1) throw new Error("you attempted to use ->, **, ++, or a similar character-class operator on a [potentially] multicharacter production");
             return elements[0].toAtom(cx);
         }
         public Seq tag(String tag) { this.tag = prefix+tag; return this; }
@@ -225,9 +225,9 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings {
         }
         public Sequence build(Context cx, Union u, NonTerminalNode cnt) {
             Sequence ret = build0(cx, cnt);
-            for(Seq s : and) { Sequence dork = s.build(cx, u, cnt); ret = ret.and(dork); }
-            for(Seq s : not) { Sequence dork = s.build(cx, u, cnt); ret = ret.andnot(dork); }
-            u.add(ret);
+            for(Seq s : and) { Sequence dork = s.build(cx, null, cnt); ret = ret.and(dork); }
+            for(Seq s : not) { Sequence dork = s.build(cx, null, cnt); ret = ret.andnot(dork); }
+            if (u!=null) u.add(ret);
             return ret;
         }
         public Sequence build0(Context cx, NonTerminalNode cnt) {
@@ -321,6 +321,11 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings {
         }
     }
 
+    public static @bind.as("\\{") ElementNode   leftBrace() {
+        return new Drop(new CharClass(new Range[] { new Range(CharAtom.left, CharAtom.left) })); }
+    public static @bind.as("\\}") ElementNode   rightBrace() {
+        return new Drop(new CharClass(new Range[] { new Range(CharAtom.right, CharAtom.right) })); }
+
     public static @bind.as("{")           class XTree                 extends ElementNode {
         public @bind.arg Seq body;
         public Element build(Context cx, NonTerminalNode cnt) {
@@ -389,15 +394,19 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings {
     public static @bind.as("~")   ElementNode tilde(final ElementNode e) {
         return new ElementNodeWrapper(e) {
                 public Atom toAtom(Context cx) {
-                    return infer((Topology<Character>)e.toAtom(cx).complement().minus(CharAtom.braces));
+                    return infer((Topology<Character>)e.toAtom(cx).complement()/*.minus(CharAtom.braces)*/);
                 }
                 public Element build(Context cx, NonTerminalNode cnt) {
-                    return infer((Topology<Character>)e.toAtom(cx).complement().minus(CharAtom.braces));
+                    return infer((Topology<Character>)e.toAtom(cx).complement()/*.minus(CharAtom.braces)*/);
                 } }; }
 
     public static @bind.as("Word")        String word(String s) { return s; }
     public static @bind.as("Quoted")      String quoted(String s) { return s; }
-    public static @bind.as("escaped")     String c(char c) { return c+""; }
+    public static @bind.as("escaped")     String c(char c) {
+        if (c=='{') return CharAtom.left+"";
+        if (c=='}') return CharAtom.right+"";
+        return c+"";
+    }
     public static @bind.as("EmptyString") String emptystring() { return ""; }
     public static @bind.as("\n")          String retur() { return "\n"; }
     public static @bind.as("\r")          String lf() { return "\r"; }