example2/
example2.rs

1use std::fmt;
2use syntree_layout::{Layouter, Visualize};
3
4#[derive(Copy, Clone, Debug)]
5enum Ast {
6    Calc,
7    CalcLst1,
8    CalcLst1Itm1,
9    Instruction,
10    Assignment,
11    AssignItem,
12    Id,
13    AssignOp,
14    LocigalOr,
15    LocigalAnd,
16    BitwiseOr,
17    BitwiseAnd,
18    Equality,
19    Relational,
20    BitwiseShift,
21    Sum,
22    Mult,
23    Power,
24    Factor,
25    Number,
26    MultLst1,
27    MultLst1Itm1,
28    MultItem,
29    MultOp,
30    SumLst1,
31    SumLst1Itm1,
32    SumItem,
33    AddOp,
34    Plus,
35    Tok(&'static str),
36}
37
38impl Visualize for Ast {
39    fn visualize(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
40        let s = match self {
41            Ast::Calc => "calc",
42            Ast::CalcLst1 => "calc_lst1",
43            Ast::CalcLst1Itm1 => "calc_lst1_itm1",
44            Ast::Instruction => "instruction",
45            Ast::Assignment => "assignment",
46            Ast::AssignItem => "assign_item",
47            Ast::Id => "id",
48            Ast::AssignOp => "assign_op",
49            Ast::LocigalOr => "locigal_or",
50            Ast::LocigalAnd => "locigal_and",
51            Ast::BitwiseOr => "bitwise_or",
52            Ast::BitwiseAnd => "bitwise_and",
53            Ast::Equality => "equality",
54            Ast::Relational => "relational",
55            Ast::BitwiseShift => "bitwise_shift",
56            Ast::Sum => "sum",
57            Ast::Mult => "mult",
58            Ast::Power => "power",
59            Ast::Factor => "factor",
60            Ast::Number => "number",
61            Ast::MultLst1 => "mult_lst1",
62            Ast::MultLst1Itm1 => "mult_lst1_itm1",
63            Ast::MultItem => "mult_item",
64            Ast::MultOp => "mult_op",
65            Ast::SumLst1 => "sum_lst1",
66            Ast::SumLst1Itm1 => "sum_lst1_itm1",
67            Ast::SumItem => "sum_item",
68            Ast::AddOp => "add_op",
69            Ast::Plus => "plus",
70            Ast::Tok(s) => s,
71        };
72
73        write!(f, "{s}")
74    }
75
76    fn emphasize(&self) -> bool {
77        matches!(self, Ast::Tok(_))
78    }
79}
80
81fn main() -> std::result::Result<(), anyhow::Error> {
82    let tree = syntree::tree! {
83        Ast::Calc => {
84            Ast::CalcLst1 => {
85                Ast::CalcLst1Itm1 => {
86                    Ast::Instruction => {
87                        Ast::Assignment => {
88                            Ast::AssignItem => {
89                                Ast::Id => { (Ast::Tok("c"), 1) },
90                                Ast::AssignOp => { (Ast::Tok("="), 1) },
91                            },
92                            Ast::LocigalOr => {
93                                Ast::LocigalAnd => {
94                                    Ast::BitwiseOr => {
95                                        Ast::BitwiseAnd => {
96                                            Ast::Equality => {
97                                                Ast::Relational => {
98                                                    Ast::BitwiseShift => {
99                                                        Ast::Sum => {
100                                                            Ast::Mult => {
101                                                                Ast::Power => {
102                                                                    Ast::Factor => {
103                                                                        Ast::Number => { (Ast::Tok("2"), 1) },
104                                                                    }
105                                                                },
106                                                                Ast::MultLst1 => {
107                                                                    Ast::MultLst1Itm1 => {
108                                                                        Ast::MultItem => {
109                                                                            Ast::MultOp => { (Ast::Tok("*"), 1) },
110                                                                            Ast::Power => {
111                                                                                Ast::Factor => {
112                                                                                    Ast::Number => { (Ast::Tok("4"), 1) },
113                                                                                }
114                                                                            }
115                                                                        }
116                                                                    }
117                                                                }
118                                                            },
119                                                            Ast::SumLst1 => {
120                                                                Ast::SumLst1Itm1 => {
121                                                                    Ast::SumItem => {
122                                                                        Ast::AddOp => {
123                                                                            Ast::Plus => { (Ast::Tok("+"), 1) }
124                                                                        },
125                                                                        Ast::Mult => {
126                                                                            Ast::Power => {
127                                                                                Ast::Factor => {
128                                                                                    Ast::Number => { (Ast::Tok("2"), 1) },
129                                                                                }
130                                                                            }
131                                                                        }
132                                                                    }
133                                                                }
134                                                            }
135                                                        }
136                                                    }
137                                                }
138                                            }
139                                        }
140                                    }
141                                }
142                            }
143                        },
144                    },
145                    (Ast::Tok(";"), 1)
146                }
147            }
148        }
149    };
150
151    Layouter::new(&tree)
152        .with_file_path("examples/example2.svg")
153        .embed_with_visualize()
154        .map_err(|e| anyhow::anyhow!(e))?
155        .write()
156        .map_err(|e| anyhow::anyhow!(e))
157}