public static boolean harsh = false;
- public static void main(String[] s) throws Exception {
+ public static void main(String[] args) throws Exception {
+ if (args.length != 2) {
+ System.err.println("usage: java " + Demo.class.getName() + " grammarfile.g com.yourdomain.package.ClassName");
+ System.exit(-1);
+ }
+ //StringBuffer sbs = new StringBuffer();
+ //((MetaGrammar)new MetaGrammar().walk(meta)).nt.get("e").toString(sbs);
+ //System.err.println(sbs);
+ String className = args[1].substring(args[1].lastIndexOf('.')+1);
+ String packageName = args[1].substring(0, args[1].lastIndexOf('.'));
+ String fileName = packageName.replace('.', '/') + "/" + className + ".java";
+
+ BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));
+ StringBuffer out = new StringBuffer();
+
+ boolean skip = false;
+ for(String s = br.readLine(); s != null; s = br.readLine()) {
+ if (s.indexOf("DO NOT EDIT STUFF BELOW: IT IS AUTOMATICALLY GENERATED") != -1 && s.indexOf("\"")==-1) skip = true;
+ if (s.indexOf("DO NOT EDIT STUFF ABOVE: IT IS AUTOMATICALLY GENERATED") != -1 && s.indexOf("\"")==-1) break;
+ if (!skip) out.append(s+"\n");
+ }
+ out.append("\n // DO NOT EDIT STUFF BELOW: IT IS AUTOMATICALLY GENERATED\n");
+
+ /*
ReflectiveMeta m = new ReflectiveMeta();
- Tree<String> res = new CharParser(MetaGrammar.make()).parse(new FileInputStream(s[0])).expand1();
+ Tree<String> res = new CharParser(MetaGrammar.make()).parse(new FileInputStream(args[0])).expand1();
MetaGrammar.Meta.MetaGrammarFile mgf = m.new MetaGrammarFile(res);
MetaGrammar.BuildContext bc = new MetaGrammar.BuildContext(mgf);
Union meta = mgf.get("s").build(bc);
- Tree t = new CharParser(meta).parse(new FileInputStream(s[1])).expand1();
-
+ Tree t = new CharParser(meta).parse(new FileInputStream(args[0])).expand1();
+ */
+ Tree t = DemoMetaGrammarTree.meta;
Union u = Demo.make(t, "s");
System.err.println();
System.err.println("== parsing with parsed grammar =================================================================================");
- t = new CharParser((Union)u).parse(new FileInputStream(s[1])).expand1();
- System.out.println(t.toPrettyString());
-
- System.err.println("== parsing with parsed-parsed grammar ==========================================================================");
- t = new CharParser(new Context(t, m).build()).parse(new FileInputStream(s[1])).expand1();
+ t = new CharParser((Union)u).parse(new FileInputStream(args[0])).expand1();
System.out.println(t.toPrettyString());
+ //Forest<String> fs = new CharParser(make()).parse(new FileInputStream(args[0]));
+ //System.out.println(fs.expand1());
+
+ //GraphViz gv = new GraphViz();
+ //fs.toGraphViz(gv);
+ //FileOutputStream fox = new FileOutputStream("out.dot");
+ //gv.dump(fox);
+ //fox.close();
+
+ t.toJava(out);
+ out.append("\n // DO NOT EDIT STUFF ABOVE: IT IS AUTOMATICALLY GENERATED\n");
+
+ for(String s = br.readLine(); s != null; s = br.readLine()) out.append(s+"\n");
+ br.close();
+
+ OutputStream os = new FileOutputStream(fileName);
+ PrintWriter p = new PrintWriter(new OutputStreamWriter(os));
+ p.println(out.toString());
+ p.flush();
+ os.close();
}
public static class ReflectiveMetaPlain extends ReflectiveMeta {
}
}
- public static class ReflectiveMeta extends MetaGrammar.Meta {
+ public static class ReflectiveMeta /*extends MetaGrammar.Meta*/ {
private final Class _cl;
private final Class[] _inner;
public ReflectiveMeta() {
}
}
public Sequence makeSequence(Production p) {
- return Sequence.rewritingSequence(new TargetReducer(p, buildSequence(p), "reducer-"+this, _bindable, isRaw()),
+ return Sequence.rewritingSequence(new TargetReducer(buildSequence(p), _bindable, isRaw()),
p.elements, p.labels, p.drops);
}
}
- public static class TargetReducer implements Tree.TreeFunctor<Object,Object> {
+ public static class TargetReducer implements Tree.TreeFunctor<Object,Object>, ToJava {
private int[] map;
- private String name;
private Bindable _bindable;
private boolean _israw;
- public TargetReducer(Production p, int[] map, String name, Bindable b, boolean raw) {
+
+ public void toJava(StringBuffer sb) {
+ sb.append("new Demo.TargetReducer(new int[] {");
+ for(int i=0; i<map.length; i++)
+ sb.append((i+"")+(i<map.length-1 ? "," : ""));
+ sb.append("}, ");
+ _bindable.toJava(sb);
+ sb.append(", ");
+ sb.append(_israw ? "true" : "false");
+ sb.append(")");
+ }
+
+ public TargetReducer(int[] map, Bindable b, boolean raw) {
this.map = map;
- this.name = name;
this._bindable = b;
this._israw = raw;
}
- public String toString() { return name; }
+ public String toString() { return "reducer-"+_bindable.toString(); }
public Object invoke(Iterable<Tree<Object>> t) {
if (_israw) return _bindable.impose(new Object[] { t });
ArrayList ret = new ArrayList();
public static Union cached = null;
public static Union make() {
+ /*
if (cached != null) return cached;
try {
ReflectiveMeta m = new ReflectiveMeta();
} catch (Exception e) {
throw new RuntimeException(e);
}
+ */
+ return make(DemoMetaGrammarTree.meta, "s");
}
public static Union make(Tree t, String s) { return make(t, s, new ReflectiveMeta()); }
public static Union make(Tree t, String s, ReflectiveMeta rm) {