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.bind.*;
+import edu.berkeley.sbp.util.*;
import java.util.*;
import java.io.*;
public class Demo {
+
+ /** our grammar class */
+ public static class Math {
+
+ public static @bind.as("(") Expr parenthesis(Expr e) { return e; }
+ public static class Expr implements Reflection.Show { }
+
+ public static @bind.as("Expr") class Numeric extends Expr {
+ public @bind.arg String numeric;
+ }
+
+ public static class BinOp extends Expr {
+ public @bind.arg Expr left;
+ public @bind.arg Expr right;
+ }
+
+ public static @bind.as("*") class Multiply extends BinOp { }
+ public static @bind.as("/") class Divide extends BinOp { }
+ public static @bind.as("+") class Add extends BinOp { }
+ public static @bind.as("-") class Subtract extends BinOp { }
+
+ }
+
+
+ // invoke "java -jar edu.berkeley.sbp.jar edu.berkeley.sbp.misc.Demo tests/demo.g <expr>"
public static void main(String[] s) throws Exception {
- Tree<String> gram = new CharParser(MetaGrammar.make()).parse(new FileInputStream(s[0])).expand1();
- MetaGrammar g = (MetaGrammar)new MetaGrammar().walk(gram);
- Union meta = g.done();
- //Tree<String> out = new CharParser(meta).parse(new FileInputStream(s[1])).expand1();
- Forest<String> out = new CharParser(meta).parse(new FileInputStream(s[1]));
- GraphViz gv = new GraphViz();
- out.toGraphViz(gv);
- gv.dump(new PrintWriter(new OutputStreamWriter(System.out)));
+
+ Parser metaGrammarParser = new CharParser(MetaGrammar.newInstance());
+ Tree<String> parsedGrammar = metaGrammarParser.parse(new CharInput(new FileInputStream(s[0]))).expand1();
+ GrammarBindingResolver gbr = new AnnotationGrammarBindingResolver(Math.class);
+ Union mathGrammar = Grammar.create(parsedGrammar, "Expr", gbr);
+ Parser mathParser = new CharParser(mathGrammar);
+
+ System.out.println("about to parse: \""+s[1]+"\"");
+ Tree tree = mathParser.parse(new CharInput(new StringReader(s[1]))).expand1();
+
+ // below is ugly voodoo which will go away very soon. ignore it.
+ Tree.TreeFunctor tf = (Tree.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));
}
+
}