X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmeta%2FMetaGrammar.java;h=91fd42feb3d3d90ba9cb8dbb8d5914aea782bbd5;hb=34202c7836b0f48a034f38e4477623d512d0b2d5;hp=78c4b725a47a490bcb3127eeace8858ba96b33c8;hpb=c8a17fdd2e149fe5feecd96c71b7f2cab286ab96;p=sbp.git diff --git a/src/edu/berkeley/sbp/meta/MetaGrammar.java b/src/edu/berkeley/sbp/meta/MetaGrammar.java index 78c4b72..91fd42f 100644 --- a/src/edu/berkeley/sbp/meta/MetaGrammar.java +++ b/src/edu/berkeley/sbp/meta/MetaGrammar.java @@ -52,51 +52,22 @@ public class MetaGrammar { p.flush(); os.close(); } - - - public static class Production { - public String tag; - public String nonTerminal; - public boolean[] drops; - public Element[] elements; - public int count = 0; - public Production(String tag, String nonTerminal, Element[] elements, boolean[] drops) { - this.tag = tag; - this.elements = elements; - this.nonTerminal = nonTerminal; - this.drops = drops; - for(int i=0; i0 && types[0]==Input.Region.class; - for(int i=0; i 0 && + _bindable.getArgTypes()[0] == Input.Region.class) { + Functor func = new Functor() { + public Object invoke(final Input.Region region) { + return + new TreeBindableReducer(buildSequence(p), + _bindable, + isRaw()) { + public Object invoke(Iterable> t) { + if (_israw) return _bindable.impose(new Object[] { t }); + ArrayList ret = new ArrayList(); + ret.add(region); + 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]); + int max = 0; + for(int i=0; i, ToJava { - private int[] map; - private Bindable _bindable; - private boolean _israw; + public static class TreeBindableReducer implements Tree.TreeFunctor, ToJava { + int[] map; + Bindable _bindable; + boolean _israw; public void toJava(StringBuffer sb) { - sb.append("new MetaGrammar.TargetReducer(new int[] {"); + sb.append("new MetaGrammar.TreeBindableReducer(new int[] {"); for(int i=0; i t) { - if (_israw) return _bindable.impose(new Object[] { t }); + public Object invoke(Iterable> t) { + if (_israw) return _bindable.createBinding().invoke(new Object[] { 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)); + ret.add(((Tree.TreeFunctor)tc.head()).invoke(tc.children())); else if (tc.numChildren() == 0) ret.add(tc.head()); else { @@ -205,17 +179,7 @@ public class MetaGrammar { } } Object[] o = (Object[])ret.toArray(new Object[0]); - int max = 0; - for(int i=0; i 0 && - _bindable.getArgTypes()[0]==Input.Region.class) - max++; - Object[] o2 = new Object[max+1]; - for(int i=0; i 0 && - _bindable.getArgTypes()[0]==Input.Region.class) - o2[0] = t.getRegion(); - return _bindable.impose(o2); + return _bindable.createBinding(map).invoke(o); } } @@ -224,7 +188,7 @@ public class MetaGrammar { public static Union make(Tree t, String s) { return make(t, s, new AnnotationGrammarBindingResolver(MetaGrammarBindings.class)); } public static Union make(Tree t, String s, GrammarBindingResolver rm) { Tree.TreeFunctor red = (Tree.TreeFunctor)t.head(); - MetaGrammarBindings.GrammarNode g = (MetaGrammarBindings.GrammarNode)red.invoke(t); + MetaGrammarBindings.GrammarNode g = (MetaGrammarBindings.GrammarNode)red.invoke(t.children()); return g.build(s, rm); }