This crate provides a way to trace a parser execution, storing positions in the input data, positions in the parser tree and parser results.
As an example, if you run the following code:
```rust
//adds a thread local storage object to store the trace declare_trace!();
pub fn main() {
named!(parser println!("parsed: {:?}", parser(&b"data: (1,2,3)"[..])); // prints the last parser trace
print_trace!(); // the list of trace events can be cleared
reset_trace!();
}
``` You would get the following result
```
parsed: Ok(("", ["1", "2", "3"]))
preceded "data: (1,2,3)" -> Ok(["1", "2", "3"])
``` Parser level is indicated through indentation. For each trace point, we have: You can add intermediate names instead of combinator names for the trace,
like this: This tracer works with parsers based on tag "data: (1,2,3)"
-> Ok("data: ")
delimited "(1,2,3)"
digit "1,2,3)"
-> Ok("1")
tag ",2,3)"
-> Ok(",")
digit "2,3)"
-> Ok("2")
tag ",3)"
-> Ok(",")
digit "3)"
-> Ok("3")
tag ")"
-> Error(Code(")", Tag))
tag ")"
-> Ok(")")
-> Ok(["1", "2", "3"])
->
followed by the parser's resulttr!(PARENS, delimited!( ... ))
this would replace the name delimited
in the trace print, with PARENS
&[u8]
and &str
input types.
For &[u8]
, input positions will be displayed as a hexdump.