X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FTree.java;h=da0c56c355f7844c557cc00d73d8ee61d3259b66;hb=aaa5d101e054dc548e7ef7831b1fcb7913a4d4d4;hp=8e3020debcaaa95421adaa9561cbcab7169d95dd;hpb=6a3a36e63c18501aa5a37c6af49f419beaa82759;p=sbp.git diff --git a/src/edu/berkeley/sbp/Tree.java b/src/edu/berkeley/sbp/Tree.java index 8e3020d..da0c56c 100644 --- a/src/edu/berkeley/sbp/Tree.java +++ b/src/edu/berkeley/sbp/Tree.java @@ -84,9 +84,14 @@ public class Tree } } - public static class BindingFunctor implements TreeFunctor/*, ToJava*/ { + public static class RawBindingFunctor implements TreeFunctor, ToJava { private Binding _binding; - public BindingFunctor(Binding binding) { + public void toJava(StringBuffer sb) { + sb.append("new Tree.RawBindingFunctor("); + _binding.toJava(sb); + sb.append(")"); + } + public RawBindingFunctor(Binding binding) { this._binding = binding; } public Object invoke(Iterable> t) { @@ -94,4 +99,31 @@ public class Tree } } + public static class BindingFunctor implements TreeFunctor, ToJava { + private Binding _binding; + public BindingFunctor(Binding binding) { + this._binding = binding; + } + public void toJava(StringBuffer sb) { + sb.append("new Tree.BindingFunctor("); + _binding.toJava(sb); + sb.append(")"); + } + public Object invoke(Iterable> t) { + ArrayList ret = new ArrayList(); + for(Tree tc : t) { + if (tc.head() != null && tc.head() instanceof Functor) + ret.add(((Tree.TreeFunctor)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); + } + } + Object[] o = (Object[])ret.toArray(new Object[0]); + return _binding.invoke(o); + } + } + }