X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmisc%2FDemo.java;h=2846d7c841e17ae2fbc59817307c6874c665c66a;hp=9c205d8670c78212a5024cdc3388c5f0690edf80;hb=16460a4ebf976fddbcb4dd79f1fa0b010d61602b;hpb=9a51c5df6d121f44c34a60fea128c5da7c3dba87 diff --git a/src/edu/berkeley/sbp/misc/Demo.java b/src/edu/berkeley/sbp/misc/Demo.java index 9c205d8..2846d7c 100644 --- a/src/edu/berkeley/sbp/misc/Demo.java +++ b/src/edu/berkeley/sbp/misc/Demo.java @@ -1,332 +1,58 @@ +// Copyright 2006 all rights reserved; see LICENSE file for BSD-style license + package edu.berkeley.sbp.misc; -import edu.berkeley.sbp.util.*; + import edu.berkeley.sbp.*; import edu.berkeley.sbp.chr.*; +import edu.berkeley.sbp.misc.*; +import edu.berkeley.sbp.meta.*; +import edu.berkeley.sbp.util.*; 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 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 new TargetMethod(m).makeSequence(p); - for(Class c : _inner) - for(Constructor con : c.getConstructors()) - if (new TargetConstructor(con).isCompatible(p)) - return new TargetConstructor(con).makeSequence(p); - for(Class c : _inner) - if (new TargetClass(c).isCompatible(p)) - return new TargetClass(c).makeSequence(p); - 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; } + // invoke "java -jar edu.berkeley.sbp.jar edu.berkeley.sbp.misc.Demo tests/demo.g " + public static void main(String[] s) throws Exception { - 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) { } } + Parser metaGrammarParser = new CharParser(MetaGrammar.newInstance()); + Tree parsedGrammar = metaGrammarParser.parse(new CharInput(new FileInputStream(s[0]))).expand1(); + Grammar.Bindings gbr = new AnnotationGrammarBindings(Math.class); + Union mathGrammar = Grammar.create(parsedGrammar, "Expr", gbr); + Parser mathParser = new CharParser(mathGrammar); - 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) { } + System.out.println("about to parse: \""+s[1]+"\""); + Tree tree = mathParser.parse(new CharInput(new StringReader(s[1]))).expand1(); - 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; } - } + // below is ugly voodoo which will go away very soon. ignore it. + TreeFunctor tf = (TreeFunctor)tree.head(); + Math.Expr e = (Math.Expr)tf.invoke(tree); + // above is ugly voodoo which will go away very soon. ignore it. + System.out.println("done!"); + System.out.println(Reflection.show(e)); + } + */ }