pub fn parse_tree(parser: &mut Parser<'_>) -> Result<TreeNode, ParseError>Expand description
Parses into a tree of TreeNode.
ยงExample
use sise::sise_tree;
let data = "(test (1 2 3))";
let mut parser = sise::Parser::new(data);
let root_node = sise::parse_tree(&mut parser).unwrap();
// Do not forget calling `finish` on the parser.
parser.finish().unwrap();
let expected_result = sise_tree!(["test", ["1", "2", "3"]]);
assert_eq!(root_node, expected_result);It does not consume the parser, so it can also be used to parse a sub-tree:
use sise::sise_tree;
let data = "(head (1 2 3) tail)";
let mut parser = sise::Parser::new(data);
// Parse the head
assert_eq!(parser.next_item().unwrap(), sise::ParsedItem::ListStart(0));
assert_eq!(
parser.next_item().unwrap(),
sise::ParsedItem::Atom("head", 1),
);
// Parse the subtree
let root_node = sise::parse_tree(&mut parser).unwrap();
let expected_result = sise_tree!(["1", "2", "3"]);
assert_eq!(root_node, expected_result);
// Parse the tail
assert_eq!(
parser.next_item().unwrap(),
sise::ParsedItem::Atom("tail", 14)
);
assert_eq!(parser.next_item().unwrap(), sise::ParsedItem::ListEnd(18));
parser.finish().unwrap();Examples found in repository?
examples/parse_sise.rs (line 21)
11fn main() {
12 let args: Vec<_> = std::env::args_os().collect();
13 if args.len() != 2 {
14 eprintln!("Usage: {} [input-file]", args[0].to_string_lossy());
15 std::process::exit(1);
16 }
17
18 let file_data = std::fs::read(&args[1]).unwrap();
19 let file_data = String::from_utf8(file_data).unwrap();
20 let mut parser = sise::Parser::new(&file_data);
21 let parsed = sise::parse_tree(&mut parser).unwrap();
22 parser.finish().unwrap();
23
24 println!("{:#?}", parsed);
25}More examples
examples/reserialize_sise.rs (line 38)
11fn main() {
12 let args: Vec<_> = std::env::args_os().collect();
13 if args.len() != 3 {
14 eprintln!(
15 "Usage: {} [compact|spaced] [input-file]",
16 args[0].to_string_lossy()
17 );
18 std::process::exit(1);
19 }
20
21 enum SerializeStyle {
22 Compact,
23 Spaced,
24 }
25
26 let serialize_style = match &*args[1].to_string_lossy() {
27 "compact" => SerializeStyle::Compact,
28 "spaced" => SerializeStyle::Spaced,
29 _ => {
30 eprintln!("Unknown style {:?}.", args[1]);
31 std::process::exit(1);
32 }
33 };
34
35 let file_data = std::fs::read(&args[2]).unwrap();
36 let file_data = String::from_utf8(file_data).unwrap();
37 let mut parser = sise::Parser::new(&file_data);
38 let parsed = sise::parse_tree(&mut parser).unwrap();
39 parser.finish().unwrap();
40
41 let break_line_at = match serialize_style {
42 SerializeStyle::Compact => usize::MAX,
43 SerializeStyle::Spaced => 0,
44 };
45 let mut reserialized = String::new();
46 let mut serializer = sise::Serializer::new(
47 sise::SerializerStyle {
48 line_break: "\n",
49 indentation: " ",
50 },
51 &mut reserialized,
52 );
53 sise::serialize_tree(&mut serializer, &parsed, break_line_at);
54 serializer.finish(false);
55 println!("{}", reserialized);
56}