checkpoint
[sbp.git] / src / edu / berkeley / sbp / tib / TibDoc.java
index e0414c8..26f8174 100644 (file)
@@ -9,6 +9,7 @@ import edu.berkeley.sbp.util.*;
 import edu.berkeley.sbp.chr.*;
 import java.util.*;
 import java.io.*;
+import static edu.berkeley.sbp.misc.Demo.*;
 
 public class TibDoc {
     /*
@@ -43,8 +44,8 @@ public class TibDoc {
         public Body   body;
         public void toHTML(ToHTML.HTML sb) { sb.tag("html", body); }
         public static class Header extends HashMap<String, Text[]> {
-            public static class kv { public String key; public Text[] val; }
-            public void attrs(kv[] kvs) { for(int i=0; i<kvs.length; i++) this.put(kvs[i].key, kvs[i].val); }
+            public static class KeyVal { public String key; public Text[] val; }
+            public void attrs(KeyVal[] KeyVals) { for(int i=0; i<KeyVals.length; i++) this.put(KeyVals[i].key, KeyVals[i].val); }
         }
         public static class Body implements ToHTML {
             public Section[] sections;
@@ -173,49 +174,6 @@ public class TibDoc {
 
 
 
-    // Main //////////////////////////////////////////////////////////////////////////////
-
-    public static void main(String[] s) throws Exception {
-        try {
-            System.out.println("parsing " + s[0]);
-            Tree<String> res = new CharParser(MetaGrammar.make()).parse(new FileInputStream(s[0])).expand1();
-            MetaGrammar gram = new Tib.Grammar(TibDoc.class);
-            gram = (MetaGrammar)gram.walk(res);
-            System.out.println("\nparsing " + s[1]);
-            Forest f = new CharParser(gram.done()).parse(new Tib(new FileInputStream(s[1])));
-            System.out.println();
-            System.out.println(f.expand1().toPrettyString());
-            System.out.println();
-            Doc doc = (Doc)new ReflectiveGrammar(TibDoc.class).build(f.expand1());
-            System.out.println(doc);
-            System.out.println();
-            System.out.println();
-            System.out.println();
-            System.out.println();
-            StringBuffer sb = new StringBuffer();
-            doc.toHTML(new ToHTML.HTML(sb));
-            System.out.println(sb);
-
-            FileOutputStream fos = new FileOutputStream("out.html");
-            PrintWriter p = new PrintWriter(new OutputStreamWriter(fos));
-            p.println(sb);
-            p.flush();
-            p.close();
-
-        } catch (Ambiguous a) {
-            FileOutputStream fos = new FileOutputStream("/Users/megacz/Desktop/out.dot");
-            PrintWriter p = new PrintWriter(new OutputStreamWriter(fos));
-            GraphViz gv = new GraphViz();
-            a.ambiguity.toGraphViz(gv);
-            gv.dump(p);
-            p.flush();
-            p.close();
-            a.printStackTrace();
-            
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
 
     */
     /*
@@ -363,5 +321,120 @@ toContex ll = prefix ++ (concatMap tl ll) ++ suffix
 
 
     */
+
+    // Main //////////////////////////////////////////////////////////////////////////////
+
+    public static class Dump implements Reflection.Show {
+        public String toString() { return Reflection.show(this); }
+    }
+
+    public static class TD {
+
+        public @nonterminal static class Doc extends Dump {
+            public @arg("head") Header head;
+            public @arg("body") Body body;
+        }
+
+        public @nonterminal static class Header extends Dump {
+            public @arg("attrs") KeyVal[] attrs;
+            // FIXME: it would be nice to be able to
+            // void KeyVal(String, String) { ... } imperatively
+        }
+        
+        public @nonterminal static class Body extends Dump {
+            public Section[] sections;
+            // FIXME: it would be nice to be able to
+            // void KeyVal(String, String) { ... } imperatively
+        }
+        
+        public @nonterminal("Section") static class Section extends Dump {
+            public String      header;
+            public Paragraph[] paragraphs;
+        }
+        
+        public @nonterminal static class KeyVal extends Dump {
+            public @arg("key") String key;
+            public @arg("val") Object val;
+        }
+
+        public static class Paragraph extends Dump { }
+        public @tag("P") static class P extends Paragraph {
+            Object text;
+        }
+        public @tag("HR") static class HR extends Paragraph { }
+        public @tag("Blockquote") static class Blockquote extends Paragraph {
+            Object text;
+        }
+    }
+
+    public static void main(String[] s) throws Exception {
+        try {
+
+            Demo.ReflectiveMeta m =
+                new Demo.ReflectiveMeta(TibDoc.TD.class,
+                                        new Class[] {
+                                            TibDoc.TD.Doc.class,
+                                            TibDoc.TD.Header.class,
+                                            TibDoc.TD.Section.class,
+                                            TibDoc.TD.Body.class,
+                                            TibDoc.TD.Paragraph.class,
+                                            TibDoc.TD.P.class,
+                                            TibDoc.TD.HR.class,
+                                            TibDoc.TD.Blockquote.class,
+                                            TibDoc.TD.KeyVal.class
+                                        });
+            Tree<String> res = new CharParser(MetaGrammar.make()).parse(new FileInputStream(s[0])).expand1();
+            MetaGrammar.Meta.MetaGrammarFile mgf = m.new MetaGrammarFile(res);
+            MetaGrammar.BuildContext bc = new MetaGrammar.BuildContext(mgf);
+            Union tibgram = mgf.get("s").build(bc);
+
+            System.err.println("parsing " + s[1]);
+            Tree t = new CharParser(tibgram).parse(new Tib(new FileInputStream(s[1]))).expand1();
+            System.out.println("tree:\n" + t.toPrettyString());
+            
+            Reducer red = (Reducer)t.head();
+            Object result = red.reduce(t);
+            System.out.println((TD.Doc)result);
+            /*
+            System.out.println("parsing " + s[0]);
+            Tree<String> res = new CharParser(MetaGrammar.make()).parse(new FileInputStream(s[0])).expand1();
+            MetaGrammar gram = new Tib.Grammar(TibDoc.class);
+            gram = (MetaGrammar)gram.walk(res);
+            System.out.println("\nparsing " + s[1]);
+            Forest f = new CharParser(gram.done()).parse(new Tib(new FileInputStream(s[1])));
+            System.out.println();
+            System.out.println(f.expand1().toPrettyString());
+            System.out.println();
+            Doc doc = (Doc)new ReflectiveGrammar(TibDoc.class).build(f.expand1());
+            System.out.println(doc);
+            System.out.println();
+            System.out.println();
+            System.out.println();
+            System.out.println();
+            StringBuffer sb = new StringBuffer();
+            doc.toHTML(new ToHTML.HTML(sb));
+            System.out.println(sb);
+
+            FileOutputStream fos = new FileOutputStream("out.html");
+            PrintWriter p = new PrintWriter(new OutputStreamWriter(fos));
+            p.println(sb);
+            p.flush();
+            p.close();
+            */
+        } catch (Ambiguous a) {
+            FileOutputStream fos = new FileOutputStream("/Users/megacz/Desktop/out.dot");
+            PrintWriter p = new PrintWriter(new OutputStreamWriter(fos));
+            GraphViz gv = new GraphViz();
+            a.ambiguity.toGraphViz(gv);
+            gv.dump(p);
+            p.flush();
+            p.close();
+            a.printStackTrace();
+            
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
 }