X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmisc%2FDemo.java;h=140af81626dff3dfa146ea00f801b93d4beb8d59;hb=643d10e52f2a42b603785a7e50f7f8aef272dfb0;hp=dbe62666eea7a2def2f2664eb76da1edcfc68bf1;hpb=80a840adb5df31ba5edd20ecac23086ad09a5ca1;p=sbp.git diff --git a/src/edu/berkeley/sbp/misc/Demo.java b/src/edu/berkeley/sbp/misc/Demo.java index dbe6266..140af81 100644 --- a/src/edu/berkeley/sbp/misc/Demo.java +++ b/src/edu/berkeley/sbp/misc/Demo.java @@ -184,6 +184,10 @@ public class Demo { public abstract tag getTag(); public abstract nonterminal getNonTerminal(); public abstract int[] buildSequence(Production p); + + private Reflection.Bindable _bindable; + public Target(Reflection.Bindable b) { this._bindable = b; } + public boolean isCompatible(Production p) { tag t = getTag(); if (t != null && @@ -223,10 +227,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 t) { return null; } - public class TargetReducer implements Functor,Object> { + public Object invokeRaw(Iterable> t) { return null; } + public class TargetReducer implements Tree.TreeFunctor { private Production p; private int[] map; private String name; @@ -236,12 +240,12 @@ public class Demo { this.name = name; } public String toString() { return name; } - public Object invoke(Iterable t) { + public Object invoke(Iterable> 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,Object>)tc.head()).invoke(tc.children())); + ret.add(((Tree.TreeFunctor)tc.head()).invoke(tc.children())); else if (tc.numChildren() == 0) ret.add(tc.head()); else { @@ -250,14 +254,19 @@ 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 t) { - try { - return _method.invoke(null, new Object[] { t }); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - public Object plant(Object[] fields, int[] map) { - try { - Class[] argTypes = _method.getParameterTypes(); - Object[] args = new Object[argTypes.length]; - int j = 0; - for(int i=0; i> t) { + return Reflection.impose(_method, new Object[] { t }); } - - if (c.isArray() && (c.getComponentType().isInstance(o))) { - Object[] ret = (Object[])Array.newInstance(c.getComponentType(), 1); - ret[0] = o; - return ret; - } - - if (o.getClass().isArray() && c.isArray()) { - boolean ok = true; - for(int i=0; i<((Object[])o).length; i++) { - Object ob = (((Object[])o)[i]); - if (ob != null) { - System.err.println("no hit with " + c.getComponentType().getName() + " on " + Reflection.show(((Object[])o)[i])); - ok = false; - } - } - if (ok) { - System.err.println("hit with " + c.getComponentType().getName()); - return Array.newInstance(c.getComponentType(), ((Object[])o).length); - } + public Object plant(Object[] fields) { + return Reflection.impose(_method, fields); } - return o; + } public static Union cached = null; @@ -465,7 +367,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,Object> red = (Functor,Object>)t.head(); + Tree.TreeFunctor red = (Tree.TreeFunctor)t.head(); MG.Grammar g = (MG.Grammar)red.invoke(t.children()); Context cx = new Context(g,rm); Union u = null; @@ -765,7 +667,7 @@ public class Demo { } public Context(Tree t, ReflectiveMeta rm) { this.rm = rm; - Functor,Object> red = (Functor,Object>)t.head(); + Tree.TreeFunctor red = (Tree.TreeFunctor)t.head(); this.grammar = (MG.Grammar)red.invoke(t.children()); } public Union peek(String name) { return map.get(name); }