X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmeta%2FMetaGrammar.java;h=91fd42feb3d3d90ba9cb8dbb8d5914aea782bbd5;hp=414d705258fabed7f1c3974c3e0660349bf91e4f;hb=34202c7836b0f48a034f38e4477623d512d0b2d5;hpb=184c7d30b66e1e2ae9ce2c0251cb3b65fd80e893 diff --git a/src/edu/berkeley/sbp/meta/MetaGrammar.java b/src/edu/berkeley/sbp/meta/MetaGrammar.java index 414d705..91fd42f 100644 --- a/src/edu/berkeley/sbp/meta/MetaGrammar.java +++ b/src/edu/berkeley/sbp/meta/MetaGrammar.java @@ -52,52 +52,22 @@ public class MetaGrammar { p.flush(); os.close(); } - - - public static class Production { - public String tag; - public String nonTerminal; - public Object[] labels; - public boolean[] drops; - public Element[] elements; - public int count = 0; - public Production(String tag, String nonTerminal, Element[] elements, Object[] labels, boolean[] drops) { - this.tag = tag; - this.elements = elements; - this.nonTerminal = nonTerminal; - this.labels = labels; - this.drops = drops; - 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[] {"); - for(int i=0; i> t) { - if (_israw) return _bindable.impose(new Object[] { 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) @@ -200,79 +178,18 @@ public class MetaGrammar { ret.add(null); } } - //System.err.println("input tree: " + t); Object[] o = (Object[])ret.toArray(new Object[0]); - int max = 0; - for(int i=0; i red = (Tree.TreeFunctor)t.head(); - MetaGrammarBindings.Grammar g = (MetaGrammarBindings.Grammar)red.invoke(t.children()); - Context cx = new Context(g,rm); - Union u = null; - for(MetaGrammarBindings.NonTerminal nt : g.values()) { - Union el = (Union)cx.get(nt.name); - StringBuffer st = new StringBuffer(); - el.toString(st); - if (nt.name.equals(s)) u = el; - } - return u; + MetaGrammarBindings.GrammarNode g = (MetaGrammarBindings.GrammarNode)red.invoke(t.children()); + return g.build(s, rm); } - - - public static class Context { - public HashMap map = new HashMap(); - public MetaGrammarBindings.Grammar grammar; - public String cnt = null; - public GrammarBindingResolver rm; - public Context(MetaGrammarBindings.Grammar g, GrammarBindingResolver rm) { - this.grammar = g; - this.rm = rm; - } - public Union build() { - Union ret = null; - for(MetaGrammarBindings.NonTerminal nt : grammar.values()) { - Union u = get(nt.name); - if ("s".equals(nt.name)) - ret = u; - } - return ret; - } - public Context(Tree t, GrammarBindingResolver rm) { - this.rm = rm; - Tree.TreeFunctor red = (Tree.TreeFunctor)t.head(); - this.grammar = (MetaGrammarBindings.Grammar)red.invoke(t.children()); - } - public Union peek(String name) { return map.get(name); } - public void put(String name, Union u) { map.put(name, u); } - public Union get(String name) { - Union ret = map.get(name); - if (ret != null) return ret; - ret = new Union(name); - map.put(name, ret); - MetaGrammarBindings.NonTerminal nt = grammar.get(name); - if (nt==null) { - System.err.println("*** warning could not find " + name); - } else { - String old = cnt; - cnt = name; - nt.build(this, ret); - cnt = old; - } - return ret; - } - - } - /*private*/ static Atom infer(Element e) { return infer((Topology)Atom.toAtom(e)); } - /*private*/ static Atom infer(Topology t) { return new CharRange(new CharTopology(t)); } }