X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmeta%2FAnnotationGrammarBindingResolver.java;fp=src%2Fedu%2Fberkeley%2Fsbp%2Fmeta%2FAnnotationGrammarBindingResolver.java;h=1955f7fd1bc56fb4679358b039a596da6c34b28c;hb=f7d5c2384df4e9e586f3c3465a6e6e0f4212115c;hp=0000000000000000000000000000000000000000;hpb=92fb8d7453b3caad1471d84dd452f5ec07785e5e;p=sbp.git diff --git a/src/edu/berkeley/sbp/meta/AnnotationGrammarBindingResolver.java b/src/edu/berkeley/sbp/meta/AnnotationGrammarBindingResolver.java new file mode 100644 index 0000000..1955f7f --- /dev/null +++ b/src/edu/berkeley/sbp/meta/AnnotationGrammarBindingResolver.java @@ -0,0 +1,62 @@ +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(); + } + + 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); + } + } +}