+
+ public static class Context {
+ public HashMap<String,Union> map = new HashMap<String,Union>();
+ public GrammarNode grammar;
+ public String cnt = null;
+ public GrammarBindingResolver rm;
+ public Context(GrammarNode g, GrammarBindingResolver rm) {
+ this.grammar = g;
+ this.rm = rm;
+ }
+ public Union build() {
+ Union ret = null;
+ for(NonTerminalNode 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<Object,Object> red = (Tree.TreeFunctor<Object,Object>)t.head();
+ this.grammar = (GrammarNode)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);
+ NonTerminalNode 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;
+ }
+
+ }
+