d2aae07397034feaa56432117db34bb655dc1160
[sbp.git] / src / edu / berkeley / sbp / meta / MetaGrammar.java
1 package edu.berkeley.sbp.meta;
2 import edu.berkeley.sbp.util.*;
3 import edu.berkeley.sbp.*;
4 import edu.berkeley.sbp.chr.*;
5 import edu.berkeley.sbp.misc.*;
6 import edu.berkeley.sbp.bind.*;
7 import java.util.*;
8 import java.lang.annotation.*;
9 import java.lang.reflect.*;
10 import java.io.*;
11
12 public class MetaGrammar {
13     
14     public static void main(String[] args) throws Exception {
15         if (args.length != 2) {
16             System.err.println("usage: java " + MetaGrammar.class.getName() + " grammarfile.g com.yourdomain.package.ClassName");
17             System.exit(-1);
18         }
19         String className   = args[1].substring(args[1].lastIndexOf('.')+1);
20         String packageName = args[1].substring(0, args[1].lastIndexOf('.'));
21         String fileName    = packageName.replace('.', '/') + "/" + className + ".java";
22
23         BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));
24         StringBuffer out = new StringBuffer();
25
26         boolean skip = false;
27         for(String s = br.readLine(); s != null; s = br.readLine()) {
28             if (s.indexOf("DO NOT EDIT STUFF BELOW: IT IS AUTOMATICALLY GENERATED") != -1 && s.indexOf("\"")==-1) skip = true;
29             if (s.indexOf("DO NOT EDIT STUFF ABOVE: IT IS AUTOMATICALLY GENERATED") != -1 && s.indexOf("\"")==-1) break;
30             if (!skip) out.append(s+"\n");
31         }
32
33         out.append("\n        // DO NOT EDIT STUFF BELOW: IT IS AUTOMATICALLY GENERATED\n");
34
35         Tree t = MetaGrammarTree.meta;
36         Union u = MetaGrammar.make(t, "s");
37
38         System.err.println();
39         System.err.println("== parsing with parsed grammar =================================================================================");
40         t = new CharParser((Union)u).parse(new FileInputStream(args[0])).expand1();
41         System.out.println(t.toPrettyString());
42
43         t.toJava(out);
44         out.append("\n        // DO NOT EDIT STUFF ABOVE: IT IS AUTOMATICALLY GENERATED\n");
45
46         for(String s = br.readLine(); s != null; s = br.readLine()) out.append(s+"\n");
47         br.close();
48
49         OutputStream os = new FileOutputStream(fileName);
50         PrintWriter p = new PrintWriter(new OutputStreamWriter(os));
51         p.println(out.toString());
52         p.flush();
53         os.close();
54     }
55
56     public static Union make() { return make(MetaGrammarTree.meta, "s"); }
57     public static Union make(Tree t, String s) { return make(t, s, new AnnotationGrammarBindingResolver(MetaGrammarBindings.class)); }
58     public static Union make(Tree t, String s, GrammarBindingResolver rm) {
59         Tree.TreeFunctor<Object,Object> red = (Tree.TreeFunctor<Object,Object>)t.head();
60         MetaGrammarBindings.GrammarNode g = (MetaGrammarBindings.GrammarNode)red.invoke(t.children());
61         return g.build(s, rm);
62     }
63
64 }