Skip to main content

layout/gv/parser/
printer.rs

1//! A collection of methods for printing the AST.
2
3use super::ast;
4
5fn print_node_id(n: &ast::NodeId, indent: usize) {
6    print!("{}", " ".repeat(indent));
7    if let Option::Some(port) = &n.port {
8        println!("{}:{}", n.name, port);
9    } else {
10        println!("{}", n.name)
11    }
12}
13fn print_arrow(k: &ast::ArrowKind, indent: usize) {
14    print!("{}", " ".repeat(indent));
15    match k {
16        ast::ArrowKind::Arrow => {
17            println!("->");
18        }
19        ast::ArrowKind::Line => {
20            println!("--");
21        }
22    }
23}
24fn print_attribute(a: &str, b: &str, indent: usize, i: usize) {
25    print!("{}", " ".repeat(indent));
26    println!("{})\"{}\" = \"{}\"", i, a, b);
27}
28fn print_attribute_list(ll: &ast::AttributeList, indent: usize) {
29    for (i, att) in ll.list.iter().enumerate() {
30        print_attribute(&att.0, &att.1, indent, i);
31    }
32}
33fn print_edge(e: &ast::EdgeStmt, indent: usize) {
34    print_node_id(&e.from, indent + 1);
35    for dest in &e.to {
36        print_arrow(&dest.1, indent + 1);
37        print_node_id(&dest.0, indent + 1);
38    }
39    print_attribute_list(&e.list, indent + 1);
40}
41fn print_node(n: &ast::NodeStmt, indent: usize) {
42    print!("Node {}", " ".repeat(indent));
43    print_node_id(&n.id, indent + 1);
44    print_attribute_list(&n.list, indent + 1);
45}
46fn print_att(att: &ast::AttrStmt, indent: usize) {
47    print!("{}", " ".repeat(indent));
48
49    match att.target {
50        ast::AttrStmtTarget::Graph => {
51            println!("Attribute Graph:");
52        }
53        ast::AttrStmtTarget::Node => {
54            println!("Attribute Node:");
55        }
56        ast::AttrStmtTarget::Edge => {
57            println!("Attribute Edge:");
58        }
59    }
60    print_attribute_list(&att.list, indent + 1);
61}
62
63fn print_stmt(stmt: &ast::Stmt, indent: usize) {
64    match stmt {
65        ast::Stmt::Edge(e) => {
66            print_edge(e, indent);
67        }
68        ast::Stmt::Node(n) => {
69            print_node(n, indent);
70        }
71        ast::Stmt::Attribute(a) => {
72            print_att(a, indent);
73        }
74        ast::Stmt::SubGraph(g) => {
75            print_graph(g, indent);
76        }
77    }
78}
79
80fn print_graph(graph: &ast::Graph, indent: usize) {
81    print!("{}", " ".repeat(indent));
82    println!("Graph: {}", graph.name);
83    for stmt in &graph.list.list {
84        print_stmt(stmt, indent + 1);
85    }
86}
87
88pub fn dump_ast(graph: &ast::Graph) {
89    print_graph(graph, 0);
90}