checkpoint
[sbp.git] / src / edu / berkeley / sbp / misc / Demo.java
index c9c18f3..82741d6 100644 (file)
@@ -64,8 +64,8 @@ public class Demo {
             this._cl = c;
             this._inner = inner;
         }
-        private boolean match(Method m, String s) { return match(m.getAnnotation(tag.class), null, s); }
-        private boolean match(tag t, Class c, String s) {
+        private boolean match(Method m, String s) { return match(m.getAnnotation(bind.as.class), null, s); }
+        private boolean match(bind.as t, Class c, String s) {
             if (t==null) return false;
             if (t.value().equals(s)) return true;
             if (c != null && t.equals("") && c.getSimpleName().equals(s)) return true;
@@ -80,14 +80,14 @@ public class Demo {
         }
         */
         private boolean match(Class c, String s, String nonTerminalName) {
-            if (match((tag)c.getAnnotation(tag.class), c, s)) return true;
-            //if (match((nonterminal)c.getAnnotation(tag.class), c, nonTerminalName)) return true;
+            if (match((bind.as)c.getAnnotation(bind.as.class), c, s)) return true;
+            //if (match((nonterminal)c.getAnnotation(bind.as.class), c, nonTerminalName)) return true;
             return false;
         }
         public boolean match(Constructor con, String s, String nonTerminalName) {
             Class c = con.getDeclaringClass();
-            if (match((tag)con.getAnnotation(tag.class), null, s)) return true;
-            //if (match((nonterminal)con.getAnnotation(tag.class), c, s)) return true;
+            if (match((bind.as)con.getAnnotation(bind.as.class), null, s)) return true;
+            //if (match((nonterminal)con.getAnnotation(bind.as.class), c, s)) return true;
             return false;
         }
         public Object repeatTag() {
@@ -140,7 +140,9 @@ public class Demo {
      *  If value() is undefined, then the class/constructor/method
      *  name is used.
      */ 
-    @Retention(RetentionPolicy.RUNTIME) public static @interface tag         { String value() default ""; }
+    public static class bind {
+        @Retention(RetentionPolicy.RUNTIME) public static @interface as         { String value() default ""; }
+    }
 
     /**
      *  If any parameter to a method or field in a class has a named
@@ -189,21 +191,21 @@ public class Demo {
         public Target(Reflection.Bindable b) { this._bindable = b; }
 
         public String getName() { return _bindable.getSimpleName(); }
-        public tag getTag() { return (tag)_bindable.getAnnotation(tag.class); }
-        //public nonterminal getNonTerminal() { return (nonterminal)_bindable.getAnnotation(tag.class); }
+        public bind.as getBindAs() { return (bind.as)_bindable.getAnnotation(bind.as.class); }
+        //public nonterminal getNonTerminal() { return (nonterminal)_bindable.getAnnotation(bind.as.class); }
         public String toString() { return _bindable.getSimpleName(); }
         public Object plant(Object[] fields) { return _bindable.impose(fields); }
         public boolean isRaw() { return _bindable.isAnnotationPresent(raw.class); }
         public Object invokeRaw(Iterable<Tree<Object>> t) { return _bindable.impose(new Object[] { t }); }
 
         public boolean isCompatible(Production p) {
-            tag t = getTag();
+            bind.as t = getBindAs();
             if (t != null &&
                 (t.value().equals(p.tag) ||
                  (t.value().equals("") && getName().equals(p.tag))))
                 return buildSequence(p)!=null;
 
-            tag n = getTag();
+            bind.as n = getBindAs();
             if (n != null &&
                 (n.value().equals(p.nonTerminal) ||
                  (n.value().equals("") && getName().equals(p.nonTerminal))))
@@ -364,7 +366,7 @@ public class Demo {
     }
 
     public static class MG {
-        public static @tag("grammar") class Grammar {
+        public static @bind.as("grammar") class Grammar {
             public NonTerminal get(String s) {
                 for(NonTerminal nt : nonterminals)
                     if (nt.name.equals(s))
@@ -402,7 +404,7 @@ public class Demo {
         }
         public static class NonTerminal extends Un {
             public String  name = null;
-            public @tag("=") NonTerminal(@arg("Word") String name,
+            public @bind.as("=") NonTerminal(@arg("Word") String name,
                                          @arg("RHS") Seq[][] sequences) {
                 this.name = name;
                 this.sequences = sequences;
@@ -411,7 +413,7 @@ public class Demo {
         }
 
         public static class AnonUn extends Un {
-            public @tag("(") AnonUn(Seq[][] sequences) {
+            public @bind.as("(") AnonUn(Seq[][] sequences) {
                 this.sequences = sequences;
             }
             public Element build(Context cx) {
@@ -421,10 +423,10 @@ public class Demo {
             }
         }
 
-        //public static @tag void range(char c) { }
+        //public static @bind.as void range(char c) { }
         public static class Range {
-            public @tag("range") Range(char only) { first = only; last = only; }
-            public @tag("-")     Range(char first, char last) { this.first = first; this.last = last; }
+            public @bind.as("range") Range(char only) { first = only; last = only; }
+            public @bind.as("-")     Range(char first, char last) { this.first = first; this.last = last; }
             public char first;
             public char last;
         }
@@ -524,19 +526,19 @@ public class Demo {
                 return ret;
             }
         }
-        public static @tag("&")   Seq  and(Seq s,         El[] elements) { return s.and(seq(elements)); }
-        public static @tag("&~")  Seq  andnot(Seq s,      El[] elements) { return s.andnot(seq(elements)); }
-        public static @tag("->")  Seq  arrow(Seq s, El e)                { return s.follow(e); }
-        public static @tag("::")  Seq  tag(String tagname, Seq s)        { return s.tag(tagname); }
-        public static @tag("/")   Seq  slash(Seq s, El e)                { return s.separate(e); }
+        public static @bind.as("&")   Seq  and(Seq s,         El[] elements) { return s.and(seq(elements)); }
+        public static @bind.as("&~")  Seq  andnot(Seq s,      El[] elements) { return s.andnot(seq(elements)); }
+        public static @bind.as("->")  Seq  arrow(Seq s, El e)                { return s.follow(e); }
+        public static @bind.as("::")  Seq  tag(String tagname, Seq s)        { return s.tag(tagname); }
+        public static @bind.as("/")   Seq  slash(Seq s, El e)                { return s.separate(e); }
 
-        public static @tag("ps")  Seq  seq(El[] elements)                { return new Seq(elements); }
-        public static @tag        Seq  psx(Seq s)                        { return s; }
-        public static @tag(":")   El   colon(String s, El e)             { return new Label(s, e); }
-        public static @tag(")")   void close(String foo)                 { throw new Error("not supported"); }
-        public static @tag("()")  El   epsilon()                         { return new Constant(Union.epsilon); }
+        public static @bind.as("ps")  Seq  seq(El[] elements)                { return new Seq(elements); }
+        public static @bind.as        Seq  psx(Seq s)                        { return s; }
+        public static @bind.as(":")   El   colon(String s, El e)             { return new Label(s, e); }
+        public static @bind.as(")")   void close(String foo)                 { throw new Error("not supported"); }
+        public static @bind.as("()")  El   epsilon()                         { return new Constant(Union.epsilon); }
 
-        public static @tag("nonTerminal") class NonTerminalReference extends El {
+        public static @bind.as("nonTerminal") class NonTerminalReference extends El {
             public @arg String nonTerminal;
             public Element build(Context cx) {
                 return cx.get(nonTerminal);
@@ -544,13 +546,13 @@ public class Demo {
         }
 
         public static class StringLiteral        extends Constant {
-            public @tag("literal") StringLiteral(String string) { super(CharRange.string(string)); }
+            public @bind.as("literal") StringLiteral(String string) { super(CharRange.string(string)); }
             public boolean drop() { return true; }
         }
 
         public static                     class CharClass            extends El {
             Range[] ranges;
-            public @tag("[") CharClass(Range[] ranges) { this.ranges = ranges; }
+            public @bind.as("[") CharClass(Range[] ranges) { this.ranges = ranges; }
             public Element build(Context cx) {
                 edu.berkeley.sbp.util.Range.Set set = new edu.berkeley.sbp.util.Range.Set();
                 for(Range r : ranges)
@@ -559,7 +561,7 @@ public class Demo {
             }
         }
 
-        public static @tag("{")           class XTree                 extends El {
+        public static @bind.as("{")           class XTree                 extends El {
             public @arg Seq body;
             public Element build(Context cx) {
                 throw new Error();
@@ -592,40 +594,40 @@ public class Demo {
         }
 
         // FIXME: it would be nice if we could hoist this into "Rep"
-        public static @tag("++")  El plusmax(final El e)                     { return new Rep(e, null, false, true, true); }
-        public static @tag("+")   El plus(final El e)                        { return new Rep(e, null, false, true, false); }
-        public static @tag("++/") El plusmaxfollow(final El e, final El sep) { return new Rep(e, sep,  false, true, true); }
-        public static @tag("+/")  El plusfollow(final El e, final El sep)    { return new Rep(e, sep,  false, true, false); }
-        public static @tag("**")  El starmax(final El e)                     { return new Rep(e, null, true,  true, true); }
-        public static @tag("*")   El star(final El e)                        { return new Rep(e, null, true,  true, false); }
-        public static @tag("**/") El starmaxfollow(final El e, final El sep) { return new Rep(e, sep,  true,  true, true); }
-        public static @tag("*/")  El starfollow(final El e, final El sep)    { return new Rep(e, sep,  true,  true, false); }
-        public static @tag("?")   El question(final El e)                    { return new Rep(e, null, true,  true, false); }
-
-        public static @tag("!")   El bang(final El e)                        { return new Drop(e); }
-
-        public static @tag("^")   El caret(final String s) {
+        public static @bind.as("++")  El plusmax(final El e)                     { return new Rep(e, null, false, true, true); }
+        public static @bind.as("+")   El plus(final El e)                        { return new Rep(e, null, false, true, false); }
+        public static @bind.as("++/") El plusmaxfollow(final El e, final El sep) { return new Rep(e, sep,  false, true, true); }
+        public static @bind.as("+/")  El plusfollow(final El e, final El sep)    { return new Rep(e, sep,  false, true, false); }
+        public static @bind.as("**")  El starmax(final El e)                     { return new Rep(e, null, true,  true, true); }
+        public static @bind.as("*")   El star(final El e)                        { return new Rep(e, null, true,  true, false); }
+        public static @bind.as("**/") El starmaxfollow(final El e, final El sep) { return new Rep(e, sep,  true,  true, true); }
+        public static @bind.as("*/")  El starfollow(final El e, final El sep)    { return new Rep(e, sep,  true,  true, false); }
+        public static @bind.as("?")   El question(final El e)                    { return new Rep(e, null, true,  true, false); }
+
+        public static @bind.as("!")   El bang(final El e)                        { return new Drop(e); }
+
+        public static @bind.as("^")   El caret(final String s) {
             return new Drop(new Constant(CharRange.string(s)) {
                     public String getOwnerTag() { return s; }
                 });
         }
 
-        public static @tag("~")   El tilde(final El e) {
+        public static @bind.as("~")   El tilde(final El e) {
             return new PostProcess(e) {
                     public Element postProcess(Element e) {
                         return MetaGrammar.infer((Topology<Character>)Atom.toAtom(e).complement()); 
                     } }; }
 
-        public static @tag("^^")  void doublecaret(final El e)                 { throw new Error("not implemented"); }
+        public static @bind.as("^^")  void doublecaret(final El e)                 { throw new Error("not implemented"); }
 
-        //public static @tag("(")   El subexpression(Seq[][] rhs)                { return new NonTerminal(rhs); }
+        //public static @bind.as("(")   El subexpression(Seq[][] rhs)                { return new NonTerminal(rhs); }
 
-        public static @tag("Word")    String word(String s) { return s; }
-        public static @tag("Quoted")  String quoted(String s) { return s; }
-        public static @tag("escaped") String c(char c) { return c+""; }
-        public static @tag("\"\"")            String emptystring() { return ""; }
-        public static @tag("\n")              String retur() { return "\n"; }
-        public static @tag("\r")              String lf() { return "\r"; }
+        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("\"\"")    String emptystring() { return ""; }
+        public static @bind.as("\n")      String retur() { return "\n"; }
+        public static @bind.as("\r")      String lf() { return "\r"; }
 
     }
     public static class Context {