--- /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 AnnotationGrammarBindingResolver extends GrammarBindingResolver {
+
+ private static boolean harsh = true;
+
+ private final Class _cl;
+ private final Class[] _inner;
+
+ public AnnotationGrammarBindingResolver() {
+ this(MetaGrammarBindings.class);
+ }
+
+ public AnnotationGrammarBindingResolver(Class c) {
+ this._cl = c;
+ this._inner = c.getDeclaredClasses();
+ }
+
+ public AnnotationGrammarBindingResolver(Class c, Class[] inner) {
+ this._cl = c;
+ this._inner = inner;
+ }
+
+ public Object repeatTag() {
+ return new Tree.ArrayBuildingTreeFunctor<Object>();
+ }
+
+ public Sequence tryResolveTag(String tag, String nonTerminalName, Element[] els, Object[] labels, boolean[] drops) {
+ for(Method m : _cl.getMethods())
+ if (new MetaGrammar.Target(m).isCompatible(tag, nonTerminalName, els, labels, drops))
+ return new MetaGrammar.Target(m).makeSequence(tag, nonTerminalName, els, labels, drops);
+ for(Class c : _inner)
+ for(Constructor con : c.getConstructors())
+ if (new MetaGrammar.Target(con).isCompatible(tag, nonTerminalName, els, labels, drops))
+ return new MetaGrammar.Target(con).makeSequence(tag, nonTerminalName, els, labels, drops);
+ for(Class c : _inner)
+ if (new MetaGrammar.Target(c).isCompatible(tag, nonTerminalName, els, labels, drops))
+ return new MetaGrammar.Target(c).makeSequence(tag, nonTerminalName, els, labels, drops);
+ return null;
+ }
+ public Sequence resolveTag(String tag, String nonTerminalName, Element[] els, Object[] labels, boolean[] drops) {
+ Sequence ret = tryResolveTag(tag, nonTerminalName, els, labels, drops);
+ if (ret != null) return ret;
+ String message = "could not find a Java method/class/ctor matching tag \""+tag+
+ "\", nonterminal \""+nonTerminalName+"\" with " + els.length + " arguments";
+ if (harsh) {
+ throw new RuntimeException(message);
+ } else {
+ System.err.println(message);
+ return Sequence.rewritingSequence(tag, els, labels, drops);
+ }
+ }
+}