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);
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;
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 {
}
}
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);
}
}
}
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();
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);
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) {
}
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;
}
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); }