X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmeta%2FMetaGrammar.java;h=a4c620b42a108da9c53416df50309d561296517c;hp=a55481bac7cfff8715a1de3fb767f2947fdf2c81;hb=2bee2b032b0422d212e17082cc4dcbf28cb897ac;hpb=d948b6363742aa34d9269cb4a49407e439ee896d diff --git a/src/edu/berkeley/sbp/meta/MetaGrammar.java b/src/edu/berkeley/sbp/meta/MetaGrammar.java index a55481b..a4c620b 100644 --- a/src/edu/berkeley/sbp/meta/MetaGrammar.java +++ b/src/edu/berkeley/sbp/meta/MetaGrammar.java @@ -52,26 +52,14 @@ public class MetaGrammar { p.flush(); os.close(); } - - - public static class Production { - public String tag; - public boolean[] drops; - public Element[] elements; - public int count = 0; - public Production(String tag, Element[] elements, boolean[] drops) { - this.tag = tag; - this.elements = elements; - 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) { + public Object invoke(Iterable> t) { if (_israw) return _bindable.impose(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,14 +231,8 @@ 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); } } @@ -222,7 +242,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); }