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}