X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmisc%2FDemo.java;h=02482fa3619b601656c2eef809b98b5b0b03d2e7;hp=4e0dc1bdbb1bdcea565d4f8bdbd929b4aa1e9e04;hb=98ae7592861f7e7d3bf5744b5db84ffdefc6011d;hpb=35698bf08ba446ffe96917e8964b5bc43404eda3 diff --git a/src/edu/berkeley/sbp/misc/Demo.java b/src/edu/berkeley/sbp/misc/Demo.java index 4e0dc1b..02482fa 100644 --- a/src/edu/berkeley/sbp/misc/Demo.java +++ b/src/edu/berkeley/sbp/misc/Demo.java @@ -3,19 +3,320 @@ import edu.berkeley.sbp.util.*; import edu.berkeley.sbp.*; import edu.berkeley.sbp.chr.*; import java.util.*; +import java.lang.annotation.*; +import java.lang.reflect.*; import java.io.*; public class Demo { public static void main(String[] s) throws Exception { - /* - Tree gram = new CharParser(MetaGrammar.make()).parse(new FileInputStream(s[0])).expand1(); - MetaGrammar g = (MetaGrammar)new MetaGrammar().walk(gram); - Union meta = g.done(); - //Tree out = new CharParser(meta).parse(new FileInputStream(s[1])).expand1(); - Forest out = new CharParser(meta).parse(new FileInputStream(s[1])); - GraphViz gv = new GraphViz(); - out.toGraphViz(gv); - gv.dump(new PrintWriter(new OutputStreamWriter(System.out))); - */ + Tree res = new CharParser(MetaGrammar.make()).parse(new FileInputStream(s[0])).expand1(); + + MetaGrammar.Meta m = + new ReflectiveMeta(MG.class, + new Class[] { + MG.Grammar.class, + MG.NonTerminal.class, + MG.Range.class, + MG.El.class, + MG.Seq.class, + MG.NonTerminalReference.class, + MG.StringLiteral.class, + MG.Epsilon.class, + MG.Tree.class, + MG.CharClass.class + }); + MetaGrammar.Meta.MetaGrammarFile mgf = m.new MetaGrammarFile(res); + MetaGrammar.BuildContext bc = new MetaGrammar.BuildContext(mgf); + Union meta = mgf.get("s").build(bc); + + System.err.println("parsing " + s[1]); + res = new CharParser(meta).parse(new FileInputStream(s[1])).expand1(); + + System.out.println(res); + } + + public static class ReflectiveMeta extends MetaGrammar.Meta { + private final Class _cl; + private final Class[] _inner; + public ReflectiveMeta(Class c, Class[] inner) { + this._cl = c; + this._inner = inner; + } + private boolean match(Method m, String s) { return match(m.getAnnotation(tag.class), null, s); } + private boolean match(tag t, Class c, String s) { + if (t==null) return false; + if (t.value().equals(s)) return true; + if (c != null && t.equals("") && c.getSimpleName().equals(s)) return true; + return false; + } + private boolean match(nonterminal t, Class c, String s) { + if (t==null) return false; + if (t.value().equals(s)) return true; + if (c != null && t.equals("") && c.getSimpleName().equals(s)) return true; + return false; + } + private boolean match(Class c, String s, String nonTerminalName) { + if (match((tag)c.getAnnotation(tag.class), c, s)) return true; + if (match((nonterminal)c.getAnnotation(nonterminal.class), c, nonTerminalName)) return true; + return false; + } + public boolean match(Constructor con, String s, String nonTerminalName) { + Class c = con.getDeclaringClass(); + if (match((tag)con.getAnnotation(tag.class), null, s)) return true; + if (match((nonterminal)con.getAnnotation(nonterminal.class), c, s)) return true; + return false; + } + public Sequence resolveTag(String tag, String nonTerminalName, Element[] els, Object[] labels, boolean[] drops) { + Production p = new Production(tag, nonTerminalName, els, labels, drops); + for(Method m : _cl.getMethods()) + if (new TargetMethod(m).isCompatible(p)) + return Sequence.rewritingSequence(m, els, labels, drops); + for(Class c : _inner) + for(Constructor con : c.getConstructors()) + if (new TargetConstructor(con).isCompatible(p)) + return Sequence.rewritingSequence(con, els, labels, drops); + for(Class c : _inner) + if (new TargetClass(c).isCompatible(p)) + return Sequence.rewritingSequence(c, els, labels, drops); + throw new RuntimeException("could not find a Java method/class/ctor matching tag \""+tag+"\", nonterminal \""+nonTerminalName+"\""); + } } + /* + public static Object makeFlattener(final Method m, final Element[] els, final Object[] labels, final boolean[] drops) { + return new Reducer() { + public Object reduce(Tree t) { + Object[] o = new Object[m.getParameterTypes()]; + int j = 0; + for(int i=0; i name.lastIndexOf('.')) { + len--; + ofs++; + } + String[] names = new String[len]; + arg[] argtags = new arg[len]; + for(int i=0; i") Seq arrow(Seq s, Element e) { return null; } + + public @tag("nonTerminal") class NonTerminalReference { public @arg String nonTerminal; } + public @tag("literal") class StringLiteral { public @arg String string; } + public @tag("()") class Epsilon { } + public @tag("{") class Tree { @arg Seq body; } + public @tag("[") class CharClass { public CharClass(Range[] ranges) { } } + + public @tag("++") void plusmax(El e) { } + public @tag("+") void plus(El e) { } + public @tag("++/") void plusmaxfollow(El e, El sep) { } + public @tag("+/") void plusfollow(El e, El sep) { } + public @tag("**") void starmax(El e) { } + public @tag("*") void star(El e) { } + public @tag("**/") void starmaxfollow(El e, El sep) { } + public @tag("*/") void starfollow(El e, El sep) { } + public @tag("!") void bang(El e) { } + public @tag("?") void question(El e) { } + public @tag("^") void caret(String s) { } + public @tag("~") void tilde(El e) { } + public @tag("^^") void doublecaret(El e) { } + public @tag("(") void subexpression(Seq[][] rhs) { } + + public @nonterminal("Word") String word(String s) { return null; } + public @nonterminal("Quoted") String quoted(String s) { return null; } + public @nonterminal("escaped") String c(char c) { return null; } + public @tag("\"\"") String emptystring() { return null; } + public @tag("\r") String lf() { return null; } + public @tag("\n") String cr() { return null; } + } + }