--- /dev/null
+package edu.berkeley.sbp.meta;
+import edu.berkeley.sbp.util.*;
+import edu.berkeley.sbp.*;
+import edu.berkeley.sbp.chr.*;
+import edu.berkeley.sbp.misc.*;
+import edu.berkeley.sbp.bind.*;
+import java.util.*;
+import java.lang.annotation.*;
+import java.lang.reflect.*;
+import java.io.*;
+
+public class Grammar {
+
+ /**
+ * Create a grammar from a parse tree.
+ *
+ * @param t a tree produced by parsing a grammar using the metagrammar
+ * @param s the name of the "start symbol"
+ */
+ public static Union create(Tree t, String s) {
+ return create(t, s, new AnnotationGrammarBindingResolver(MetaGrammarBindings.class));
+ }
+
+ /**
+ * Create a grammar from a parse tree and binding resolver
+ *
+ * @param t a tree produced by parsing a grammar using the metagrammar
+ * @param s the name of the "start symbol"
+ * @param gbr a GrammarBindingResolver that resolves grammatical reductions into tree-node-heads
+ */
+ public static Union create(Tree t, String s, GrammarBindingResolver gbr) {
+ Tree.TreeFunctor<Object,Object> red = (Tree.TreeFunctor<Object,Object>)t.head();
+ MetaGrammarBindings.GrammarNode g = (MetaGrammarBindings.GrammarNode)red.invoke(t.children());
+ return g.build(s, gbr);
+ }
+
+}