Browse Source

start to use custom printing functions instead

Getty Ritter 2 years ago
parent
commit
05dcdb80b0
7 changed files with 96 additions and 687 deletions
  1. 40 0
      src/ast.rs
  2. 12 58
      tests/assn.parsed
  3. 2 20
      tests/atom_lit.parsed
  4. 26 470
      tests/exprs.parsed
  5. 2 20
      tests/num_lit.parsed
  6. 10 117
      tests/str_lit.parsed
  7. 4 2
      tools/regenerate.rs

+ 40 - 0
src/ast.rs

@@ -1,9 +1,22 @@
+use std::fmt;
+
 pub type Name = string_interner::DefaultSymbol;
 
 pub struct ASTArena {
     strings: string_interner::StringInterner,
 }
 
+pub struct Debuggable<'a, T> {
+    arena: &'a ASTArena,
+    value: &'a T,
+}
+
+impl<'a> std::fmt::Debug for Debuggable<'a, Stmt> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        self.arena.show_stmt(self.value, f)
+    }
+}
+
 impl ASTArena {
     pub fn new() -> ASTArena {
         ASTArena {
@@ -14,6 +27,24 @@ impl ASTArena {
     pub fn add_string(&mut self, s: &str) -> Name {
         self.strings.get_or_intern(s)
     }
+
+    pub fn show_stmt(&self, stmt: &Stmt, f: &mut fmt::Formatter) -> fmt::Result {
+        match stmt {
+            Stmt::Puts(expr) =>
+                writeln!(f, "{:?}", expr),
+            Stmt::Fix(name) =>
+                writeln!(f, "Fix({})", &self[*name]),
+            Stmt::Assn(name, expr) =>
+                writeln!(f, "Assn(\n  {},\n  {:?}\n)", &self[*name], expr),
+            Stmt::LitAssn(name, strs) => {
+                write!(f, "LitAssn({}, [ ", &self[*name])?;
+                for str in strs.iter() {
+                    write!(f, " {} ", str)?;
+                }
+                writeln!(f, "]")
+            }
+        }
+    }
 }
 
 impl std::ops::Index<string_interner::DefaultSymbol> for ASTArena {
@@ -32,6 +63,15 @@ pub enum Stmt {
     LitAssn(Name, Vec<String>),
 }
 
+impl Stmt {
+    pub fn show<'a>(&'a self, ast: &'a ASTArena) -> Debuggable<'a, Stmt> {
+        Debuggable {
+            arena: ast,
+            value: self,
+        }
+    }
+}
+
 #[derive(Debug, Clone)]
 pub enum Expr {
     Var(Name),

+ 12 - 58
tests/assn.parsed

@@ -1,58 +1,12 @@
-[
-    Assn(
-        "x",
-        Chc(
-            [
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Lit(
-                                Num(
-                                    5,
-                                ),
-                            ),
-                        ],
-                    ),
-                },
-            ],
-        ),
-    ),
-    Assn(
-        "y",
-        Chc(
-            [
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Lit(
-                                Atom(
-                                    "This",
-                                ),
-                            ),
-                        ],
-                    ),
-                },
-            ],
-        ),
-    ),
-    LitAssn(
-        "a",
-        [
-            "a",
-            "b",
-            "c",
-            "d",
-        ],
-    ),
-    LitAssn(
-        "fóo",
-        [
-            "á",
-            "þ",
-            "ç",
-            "đ",
-        ],
-    ),
-]
+Assn(
+  x,
+  Chc([Choice { weight: None, value: Cat([Lit(Num(5))]) }]))
+
+Assn(
+  y,
+  Chc([Choice { weight: None, value: Cat([Lit(Atom(SymbolU32 { value: 3 }))]) }]))
+
+LitAssn(a, [  a  b  c  d ]
+
+LitAssn(fóo, [  á  þ  ç  đ ]
+

+ 2 - 20
tests/atom_lit.parsed

@@ -1,20 +1,2 @@
-[
-    Puts(
-        Chc(
-            [
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Lit(
-                                Atom(
-                                    "Foo",
-                                ),
-                            ),
-                        ],
-                    ),
-                },
-            ],
-        ),
-    ),
-]
+Chc([Choice { weight: None, value: Cat([Lit(Atom(SymbolU32 { value: 1 }))]) }])
+

+ 26 - 470
tests/exprs.parsed

@@ -1,470 +1,26 @@
-[
-    Puts(
-        Chc(
-            [
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Lit(
-                                Atom(
-                                    "This",
-                                ),
-                            ),
-                            Lit(
-                                Atom(
-                                    "That",
-                                ),
-                            ),
-                            Lit(
-                                Atom(
-                                    "The-Other",
-                                ),
-                            ),
-                        ],
-                    ),
-                },
-            ],
-        ),
-    ),
-    Puts(
-        Chc(
-            [
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Lit(
-                                Atom(
-                                    "This",
-                                ),
-                            ),
-                        ],
-                    ),
-                },
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Lit(
-                                Atom(
-                                    "That",
-                                ),
-                            ),
-                        ],
-                    ),
-                },
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Lit(
-                                Atom(
-                                    "The-Other",
-                                ),
-                            ),
-                        ],
-                    ),
-                },
-            ],
-        ),
-    ),
-    Puts(
-        Chc(
-            [
-                Choice {
-                    weight: Some(
-                        5,
-                    ),
-                    value: Cat(
-                        [
-                            Lit(
-                                Atom(
-                                    "This",
-                                ),
-                            ),
-                        ],
-                    ),
-                },
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Lit(
-                                Atom(
-                                    "That",
-                                ),
-                            ),
-                        ],
-                    ),
-                },
-            ],
-        ),
-    ),
-    Puts(
-        Chc(
-            [
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Ap(
-                                Ap(
-                                    Var(
-                                        "foo",
-                                    ),
-                                    Var(
-                                        "bar",
-                                    ),
-                                ),
-                                Var(
-                                    "baz",
-                                ),
-                            ),
-                        ],
-                    ),
-                },
-            ],
-        ),
-    ),
-    Puts(
-        Chc(
-            [
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Tup(
-                                [
-                                    Chc(
-                                        [
-                                            Choice {
-                                                weight: None,
-                                                value: Cat(
-                                                    [],
-                                                ),
-                                            },
-                                        ],
-                                    ),
-                                ],
-                            ),
-                        ],
-                    ),
-                },
-            ],
-        ),
-    ),
-    Puts(
-        Chc(
-            [
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Tup(
-                                [
-                                    Chc(
-                                        [
-                                            Choice {
-                                                weight: None,
-                                                value: Cat(
-                                                    [
-                                                        Lit(
-                                                            Num(
-                                                                1,
-                                                            ),
-                                                        ),
-                                                    ],
-                                                ),
-                                            },
-                                        ],
-                                    ),
-                                ],
-                            ),
-                        ],
-                    ),
-                },
-            ],
-        ),
-    ),
-    Puts(
-        Chc(
-            [
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Tup(
-                                [
-                                    Chc(
-                                        [
-                                            Choice {
-                                                weight: None,
-                                                value: Cat(
-                                                    [
-                                                        Lit(
-                                                            Num(
-                                                                1,
-                                                            ),
-                                                        ),
-                                                    ],
-                                                ),
-                                            },
-                                        ],
-                                    ),
-                                    Chc(
-                                        [
-                                            Choice {
-                                                weight: None,
-                                                value: Cat(
-                                                    [
-                                                        Lit(
-                                                            Num(
-                                                                2,
-                                                            ),
-                                                        ),
-                                                    ],
-                                                ),
-                                            },
-                                        ],
-                                    ),
-                                ],
-                            ),
-                        ],
-                    ),
-                },
-            ],
-        ),
-    ),
-    Puts(
-        Chc(
-            [
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Tup(
-                                [
-                                    Chc(
-                                        [
-                                            Choice {
-                                                weight: None,
-                                                value: Cat(
-                                                    [
-                                                        Lit(
-                                                            Num(
-                                                                1,
-                                                            ),
-                                                        ),
-                                                    ],
-                                                ),
-                                            },
-                                        ],
-                                    ),
-                                    Chc(
-                                        [
-                                            Choice {
-                                                weight: None,
-                                                value: Cat(
-                                                    [
-                                                        Lit(
-                                                            Num(
-                                                                2,
-                                                            ),
-                                                        ),
-                                                    ],
-                                                ),
-                                            },
-                                        ],
-                                    ),
-                                    Chc(
-                                        [
-                                            Choice {
-                                                weight: None,
-                                                value: Cat(
-                                                    [
-                                                        Lit(
-                                                            Num(
-                                                                3,
-                                                            ),
-                                                        ),
-                                                    ],
-                                                ),
-                                            },
-                                        ],
-                                    ),
-                                ],
-                            ),
-                        ],
-                    ),
-                },
-            ],
-        ),
-    ),
-    Puts(
-        Chc(
-            [
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Range(
-                                Lit(
-                                    Num(
-                                        0,
-                                    ),
-                                ),
-                                Lit(
-                                    Num(
-                                        20,
-                                    ),
-                                ),
-                            ),
-                        ],
-                    ),
-                },
-            ],
-        ),
-    ),
-    Puts(
-        Chc(
-            [
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Range(
-                                Var(
-                                    "x",
-                                ),
-                                Var(
-                                    "y",
-                                ),
-                            ),
-                        ],
-                    ),
-                },
-            ],
-        ),
-    ),
-    Puts(
-        Chc(
-            [
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Ap(
-                                Var(
-                                    "f",
-                                ),
-                                Var(
-                                    "x",
-                                ),
-                            ),
-                        ],
-                    ),
-                },
-            ],
-        ),
-    ),
-    Puts(
-        Chc(
-            [
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Fun(
-                                [
-                                    Case {
-                                        pat: Var(
-                                            "x",
-                                        ),
-                                        expr: Chc(
-                                            [
-                                                Choice {
-                                                    weight: None,
-                                                    value: Cat(
-                                                        [
-                                                            Var(
-                                                                "x",
-                                                            ),
-                                                        ],
-                                                    ),
-                                                },
-                                            ],
-                                        ),
-                                    },
-                                ],
-                            ),
-                        ],
-                    ),
-                },
-            ],
-        ),
-    ),
-    Puts(
-        Chc(
-            [
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Fun(
-                                [
-                                    Case {
-                                        pat: Lit(
-                                            Atom(
-                                                "True",
-                                            ),
-                                        ),
-                                        expr: Chc(
-                                            [
-                                                Choice {
-                                                    weight: None,
-                                                    value: Cat(
-                                                        [
-                                                            Lit(
-                                                                Str(
-                                                                    "yes",
-                                                                ),
-                                                            ),
-                                                        ],
-                                                    ),
-                                                },
-                                            ],
-                                        ),
-                                    },
-                                    Case {
-                                        pat: Lit(
-                                            Atom(
-                                                "False",
-                                            ),
-                                        ),
-                                        expr: Chc(
-                                            [
-                                                Choice {
-                                                    weight: None,
-                                                    value: Cat(
-                                                        [
-                                                            Lit(
-                                                                Str(
-                                                                    "no",
-                                                                ),
-                                                            ),
-                                                        ],
-                                                    ),
-                                                },
-                                            ],
-                                        ),
-                                    },
-                                ],
-                            ),
-                        ],
-                    ),
-                },
-            ],
-        ),
-    ),
-]
+Chc([Choice { weight: None, value: Cat([Lit(Atom(SymbolU32 { value: 1 })), Lit(Atom(SymbolU32 { value: 2 })), Lit(Atom(SymbolU32 { value: 3 }))]) }])
+
+Chc([Choice { weight: None, value: Cat([Lit(Atom(SymbolU32 { value: 1 }))]) }, Choice { weight: None, value: Cat([Lit(Atom(SymbolU32 { value: 2 }))]) }, Choice { weight: None, value: Cat([Lit(Atom(SymbolU32 { value: 3 }))]) }])
+
+Chc([Choice { weight: Some(5), value: Cat([Lit(Atom(SymbolU32 { value: 1 }))]) }, Choice { weight: None, value: Cat([Lit(Atom(SymbolU32 { value: 2 }))]) }])
+
+Chc([Choice { weight: None, value: Cat([Ap(Ap(Var(SymbolU32 { value: 4 }), Var(SymbolU32 { value: 5 })), Var(SymbolU32 { value: 6 }))]) }])
+
+Chc([Choice { weight: None, value: Cat([Tup([Chc([Choice { weight: None, value: Cat([]) }])])]) }])
+
+Chc([Choice { weight: None, value: Cat([Tup([Chc([Choice { weight: None, value: Cat([Lit(Num(1))]) }])])]) }])
+
+Chc([Choice { weight: None, value: Cat([Tup([Chc([Choice { weight: None, value: Cat([Lit(Num(1))]) }]), Chc([Choice { weight: None, value: Cat([Lit(Num(2))]) }])])]) }])
+
+Chc([Choice { weight: None, value: Cat([Tup([Chc([Choice { weight: None, value: Cat([Lit(Num(1))]) }]), Chc([Choice { weight: None, value: Cat([Lit(Num(2))]) }]), Chc([Choice { weight: None, value: Cat([Lit(Num(3))]) }])])]) }])
+
+Chc([Choice { weight: None, value: Cat([Range(Lit(Num(0)), Lit(Num(20)))]) }])
+
+Chc([Choice { weight: None, value: Cat([Range(Var(SymbolU32 { value: 7 }), Var(SymbolU32 { value: 8 }))]) }])
+
+Chc([Choice { weight: None, value: Cat([Ap(Var(SymbolU32 { value: 9 }), Var(SymbolU32 { value: 7 }))]) }])
+
+Chc([Choice { weight: None, value: Cat([Fun([Case { pat: Var(SymbolU32 { value: 7 }), expr: Chc([Choice { weight: None, value: Cat([Var(SymbolU32 { value: 7 })]) }]) }])]) }])
+
+Chc([Choice { weight: None, value: Cat([Fun([Case { pat: Lit(Atom(SymbolU32 { value: 10 })), expr: Chc([Choice { weight: None, value: Cat([Lit(Str("yes"))]) }]) }, Case { pat: Lit(Atom(SymbolU32 { value: 11 })), expr: Chc([Choice { weight: None, value: Cat([Lit(Str("no"))]) }]) }])]) }])
+

+ 2 - 20
tests/num_lit.parsed

@@ -1,20 +1,2 @@
-[
-    Puts(
-        Chc(
-            [
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Lit(
-                                Num(
-                                    55,
-                                ),
-                            ),
-                        ],
-                    ),
-                },
-            ],
-        ),
-    ),
-]
+Chc([Choice { weight: None, value: Cat([Lit(Num(55))]) }])
+

+ 10 - 117
tests/str_lit.parsed

@@ -1,117 +1,10 @@
-[
-    Puts(
-        Chc(
-            [
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Lit(
-                                Str(
-                                    "foo",
-                                ),
-                            ),
-                            Lit(
-                                Str(
-                                    "foo",
-                                ),
-                            ),
-                        ],
-                    ),
-                },
-            ],
-        ),
-    ),
-    Puts(
-        Chc(
-            [
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Lit(
-                                Str(
-                                    "foo bar baz",
-                                ),
-                            ),
-                            Lit(
-                                Str(
-                                    "foo bar baz",
-                                ),
-                            ),
-                        ],
-                    ),
-                },
-            ],
-        ),
-    ),
-    Puts(
-        Chc(
-            [
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Lit(
-                                Str(
-                                    "won't you",
-                                ),
-                            ),
-                            Lit(
-                                Str(
-                                    "quoth the raven \"nevermore\"",
-                                ),
-                            ),
-                        ],
-                    ),
-                },
-            ],
-        ),
-    ),
-    Puts(
-        Chc(
-            [
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Lit(
-                                Str(
-                                    "this\nthat",
-                                ),
-                            ),
-                            Lit(
-                                Str(
-                                    "one\ntwo",
-                                ),
-                            ),
-                        ],
-                    ),
-                },
-            ],
-        ),
-    ),
-    Puts(
-        Chc(
-            [
-                Choice {
-                    weight: None,
-                    value: Cat(
-                        [
-                            Lit(
-                                Str(
-                                    "\n\t\r",
-                                ),
-                            ),
-                            Lit(
-                                Str(
-                                    "\n\t\r",
-                                ),
-                            ),
-                        ],
-                    ),
-                },
-            ],
-        ),
-    ),
-]
+Chc([Choice { weight: None, value: Cat([Lit(Str("foo")), Lit(Str("foo"))]) }])
+
+Chc([Choice { weight: None, value: Cat([Lit(Str("foo bar baz")), Lit(Str("foo bar baz"))]) }])
+
+Chc([Choice { weight: None, value: Cat([Lit(Str("won't you")), Lit(Str("quoth the raven \"nevermore\""))]) }])
+
+Chc([Choice { weight: None, value: Cat([Lit(Str("this\nthat")), Lit(Str("one\ntwo"))]) }])
+
+Chc([Choice { weight: None, value: Cat([Lit(Str("\n\t\r")), Lit(Str("\n\t\r"))]) }])
+

+ 4 - 2
tools/regenerate.rs

@@ -19,9 +19,11 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
             let mut ast = matzo::ast::ASTArena::new();
             let src = std::fs::read_to_string(&exp)?;
             let tokens = lexer::tokens(&src);
-            if let Ok(ast) = grammar::StmtsParser::new().parse(&mut ast, tokens) {
+            if let Ok(stmts) = grammar::StmtsParser::new().parse(&mut ast, tokens) {
                 let mut f = std::fs::File::create(exp_filename("parsed"))?;
-                writeln!(f, "{:#?}", ast)?;
+                for stmt in stmts {
+                    writeln!(f, "{:#?}", stmt.show(&ast))?;
+                }
             }
         }
     }