str_parser/
str_parser.rs

1use nom::branch::*;
2use nom::character::complete::*;
3use nom::IResult;
4use nom_locate::LocatedSpan;
5use nom_tracable::{cumulative_histogram, histogram, tracable_parser, TracableInfo};
6
7// Input type must implement trait Tracable
8// nom_locate::LocatedSpan<T, TracableInfo> implements it.
9type Span<'a> = LocatedSpan<&'a str, TracableInfo>;
10
11// Apply tracable_parser by custom attribute
12#[tracable_parser]
13pub fn expr(s: Span) -> IResult<Span, String> {
14    alt((expr_plus, expr_minus, term))(s)
15}
16
17#[tracable_parser]
18pub fn expr_plus(s: Span) -> IResult<Span, String> {
19    let (s, x) = term(s)?;
20    let (s, y) = char('+')(s)?;
21    let (s, z) = expr(s)?;
22    let ret = format!("{}{}{}", x, y, z);
23    Ok((s, ret))
24}
25
26#[tracable_parser]
27pub fn expr_minus(s: Span) -> IResult<Span, String> {
28    let (s, x) = term(s)?;
29    let (s, y) = char('-')(s)?;
30    let (s, z) = expr(s)?;
31    let ret = format!("{}{}{}", x, y, z);
32    Ok((s, ret))
33}
34
35#[tracable_parser]
36pub fn term(s: Span) -> IResult<Span, String> {
37    let (s, x) = term_internal(s)?;
38    Ok((s, x))
39}
40
41#[tracable_parser]
42pub fn term_internal(s: Span) -> IResult<Span, String> {
43    let (s, x) = char('1')(s)?;
44    Ok((s, x.to_string()))
45}
46
47fn main() {
48    // Configure trace setting
49    let info = TracableInfo::new().parser_width(64).fold("term");
50    let _ret = expr(LocatedSpan::new_extra("1-1+1+1-1", info));
51
52    // Show histogram
53    histogram();
54    cumulative_histogram();
55}