checkpoint
[sbp.git] / src / edu / berkeley / sbp / misc / Demo.java
index b6c0524..2891b0f 100644 (file)
@@ -89,23 +89,7 @@ public class Demo {
             return false;
         }
         public Object repeatTag() {
-            return new Functor<Iterable<Tree>,Object>() {
-                    public String toString() { return ""; }
-                    public Object invoke(Iterable<Tree> t) {
-                        ArrayList ret = new ArrayList();
-                        for(Tree tc : t) {
-                            if (tc.head() != null && tc.head() instanceof Functor)
-                                ret.add(((Functor<Iterable<Tree>,Object>)tc.head()).invoke(tc.children()));
-                            else if (tc.numChildren() == 0)
-                                ret.add(tc.head());
-                            else {
-                                System.err.println("FIXME: don't know what to do about " + tc);
-                                ret.add(null);
-                            }
-                        }
-                        return ret.toArray(new Object[0]);
-                    }
-                };
+            return new Tree.ArrayBuildingTreeFunctor<Object>();
         }
         public Sequence tryResolveTag(String tag, String nonTerminalName, Element[] els, Object[] labels, boolean[] drops) {
             Production p = new Production(tag, nonTerminalName, els, labels, drops);
@@ -239,10 +223,10 @@ public class Demo {
         public Sequence makeSequence(Production p) {
             return Sequence.rewritingSequence(new TargetReducer(p, buildSequence(p), "reducer-"+this), p.elements, p.labels, p.drops);
         }
-        public abstract Object plant(Object[] fields, int[] map);
+        public abstract Object plant(Object[] fields);
         public boolean isRaw() { return false; }
-        public Object invokeRaw(Iterable<Tree> t) { return null; }
-        public class TargetReducer implements Functor<Iterable<Tree>,Object> {
+        public Object invokeRaw(Iterable<Tree<Object>> t) { return null; }
+        public class TargetReducer implements Tree.TreeFunctor<Object,Object> {
             private Production p;
             private int[] map;
             private String name;
@@ -252,12 +236,12 @@ public class Demo {
                 this.name = name;
             }
             public String toString() { return name; }
-            public Object invoke(Iterable<Tree> t) {
+            public Object invoke(Iterable<Tree<Object>> t) {
                 if (isRaw()) return invokeRaw(t);
                 ArrayList ret = new ArrayList();
                 for(Tree tc : t) {
                     if (tc.head() != null && tc.head() instanceof Functor)
-                        ret.add(((Functor<Iterable<Tree>,Object>)tc.head()).invoke(tc.children()));
+                        ret.add(((Tree.TreeFunctor<Object,Object>)tc.head()).invoke(tc.children()));
                     else if (tc.numChildren() == 0)
                         ret.add(tc.head());
                     else {
@@ -266,7 +250,12 @@ public class Demo {
                     }
                 }
                 System.err.println("input tree: " + t);
-                return plant(ret.toArray(new Object[0]), map);
+                Object[] o = (Object[])ret.toArray(new Object[0]);
+                int max = 0;
+                for(int i=0; i<map.length; i++) max = Math.max(map[i], max);
+                Object[] o2 = new Object[max+1];
+                for(int i=0; i<o.length; i++) o2[map[i]] = o[i];
+                return plant(o2);
             }
         }
     }
@@ -293,20 +282,19 @@ public class Demo {
                     return new TargetConstructor(c).buildSequence(p);
             return null;
         }
-        public Object plant(Object[] fields, int[] map) {
+        public Object plant(Object[] fields) {
             try {
                 Object ret = _class.newInstance();
                 Field[] f = _class.getFields();
                 int j = 0;
-                for(int i=0; i<f.length; i++)
-                    if (map[i] != -1) {
-                        Object tgt = Reflection.lub(fields[map[i]]);
-                        if (f[i].getType() == String.class) tgt = stringify(tgt);
-                        // FUGLY
-                        tgt = coerce(tgt, f[i].getType());
-                        System.err.println("setting a " + f[i].getType().getName() + " to " + Reflection.show(tgt));
-                        f[i].set(ret, tgt);
-                    }
+                for(int i=0; i<f.length; i++) {
+                    Object tgt = Reflection.lub(fields[i]);
+                    if (f[i].getType() == String.class) tgt = stringify(tgt);
+                    // FUGLY
+                    tgt = coerce(tgt, f[i].getType());
+                    System.err.println("setting a " + f[i].getType().getName() + " to " + Reflection.show(tgt));
+                    f[i].set(ret, tgt);
+                }
                 return ret;
             } catch (Exception e) {
                 e.printStackTrace();
@@ -351,20 +339,19 @@ public class Demo {
                         argtags[i+ofs] = (arg)a;
             return buildSequence(p, names, argtags);
         }
-        public Object plant(Object[] fields, int[] map) {
+        public Object plant(Object[] fields) {
             try {
                 Class[] argTypes = _ctor.getParameterTypes();
                 Object[] args = new Object[argTypes.length];
                 int j = 0;
-                for(int i=0; i<args.length; i++)
-                    if (map[i] != -1) {
-                        Object tgt = Reflection.lub(fields[map[i]]);
-                        if (argTypes[i] == String.class) tgt = stringify(tgt);
-                        // FUGLY
-                        tgt = coerce(tgt, argTypes[i]);
-                        System.err.println("setting a " + argTypes[i].getName() + " to " + Reflection.show(tgt));
-                        args[i] = tgt;
-                    }
+                for(int i=0; i<args.length; i++) {
+                    Object tgt = Reflection.lub(fields[i]);
+                    if (argTypes[i] == String.class) tgt = stringify(tgt);
+                    // FUGLY
+                    tgt = coerce(tgt, argTypes[i]);
+                    System.err.println("setting a " + argTypes[i].getName() + " to " + Reflection.show(tgt));
+                    args[i] = tgt;
+                }
                 return _ctor.newInstance(args);
             } catch (Exception e) {
                 throw new RuntimeException(e);
@@ -390,27 +377,26 @@ public class Demo {
             return ret;
         }
         public boolean isRaw() { return _method.isAnnotationPresent(raw.class); }
-        public Object invokeRaw(Iterable<Tree> t) {
+        public Object invokeRaw(Iterable<Tree<Object>> t) {
             try {
                 return _method.invoke(null, new Object[] { t });
             } catch (Exception e) {
                 throw new RuntimeException(e);
             }
         }
-        public Object plant(Object[] fields, int[] map) {
+        public Object plant(Object[] fields) {
             try {
                 Class[] argTypes = _method.getParameterTypes();
                 Object[] args = new Object[argTypes.length];
                 int j = 0;
-                for(int i=0; i<args.length; i++)
-                    if (map[i] != -1) {
-                        Object tgt = Reflection.lub(fields[map[i]]);
-                        if (argTypes[i] == String.class) tgt = stringify(tgt);
-                        // FUGLY
-                        tgt = coerce(tgt, argTypes[i]);
-                        System.err.println("setting a " + argTypes[i].getName() + " to " + Reflection.show(tgt));
-                        args[i] = tgt;
-                    }
+                for(int i=0; i<args.length; i++) {
+                    Object tgt = Reflection.lub(fields[i]);
+                    if (argTypes[i] == String.class) tgt = stringify(tgt);
+                    // FUGLY
+                    tgt = coerce(tgt, argTypes[i]);
+                    System.err.println("setting a " + argTypes[i].getName() + " to " + Reflection.show(tgt));
+                    args[i] = tgt;
+                }
                 System.err.println("invoking " + _method + " with " + Reflection.show(args));
                 return _method.invoke(null, args);
             } catch (Exception e) {
@@ -481,7 +467,7 @@ public class Demo {
     }
     public static Union make(Tree t, String s) { return make(t, s, new ReflectiveMeta()); }
     public static Union make(Tree t, String s, ReflectiveMeta rm) {
-        Functor<Iterable<Tree>,Object> red = (Functor<Iterable<Tree>,Object>)t.head();
+        Tree.TreeFunctor<Object,Object> red = (Tree.TreeFunctor<Object,Object>)t.head();
         MG.Grammar g = (MG.Grammar)red.invoke(t.children());
         Context cx = new Context(g,rm);
         Union u = null;
@@ -781,7 +767,7 @@ public class Demo {
         }
         public Context(Tree t, ReflectiveMeta rm) {
             this.rm = rm;
-            Functor<Iterable<Tree>,Object> red = (Functor<Iterable<Tree>,Object>)t.head();
+            Tree.TreeFunctor<Object,Object> red = (Tree.TreeFunctor<Object,Object>)t.head();
             this.grammar = (MG.Grammar)red.invoke(t.children());
         }
         public Union peek(String name) { return map.get(name); }