parse_tree

Function parse_tree 

Source
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
Hide additional 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}