1use nom::branch::*;
2use nom::character::complete::*;
3use nom::IResult;
4use nom_locate::LocatedSpan;
5use nom_tracable::{cumulative_histogram, histogram, tracable_parser, TracableInfo};
6
7type Span<'a> = LocatedSpan<&'a str, TracableInfo>;
10
11#[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 let info = TracableInfo::new().parser_width(64).fold("term");
50 let _ret = expr(LocatedSpan::new_extra("1-1+1+1-1", info));
51
52 histogram();
54 cumulative_histogram();
55}