[−][src]Crate nom_recursive
nom-recursive
is an extension of nom to handle left recursion.
Examples
The following example show a quick example.
If #[recursive_parser]
is removed, stack overflow will occur because of infinite recursion.
use nom::branch::*; use nom::character::complete::*; use nom::IResult; use nom_locate::LocatedSpanEx; use nom_recursive::{recursive_parser, RecursiveInfo}; // Input type must implement trait HasRecursiveInfo // nom_locate::LocatedSpanEx<T, RecursiveInfo> implements it. type Span<'a> = LocatedSpanEx<&'a str, RecursiveInfo>; pub fn expr(s: Span) -> IResult<Span, String> { alt((expr_binary, term))(s) } // Apply recursive_parser by custom attribute #[recursive_parser] pub fn expr_binary(s: Span) -> IResult<Span, String> { let (s, x) = expr(s)?; let (s, y) = char('+')(s)?; let (s, z) = expr(s)?; let ret = format!("{}{}{}", x, y, z); Ok((s, ret)) } pub fn term(s: Span) -> IResult<Span, String> { let (s, x) = char('1')(s)?; Ok((s, x.to_string())) } fn main() { let ret = expr(LocatedSpanEx::new_extra("1+1", RecursiveInfo::new())); println!("{:?}", ret.unwrap().1); }
Re-exports
pub use nom_recursive_macros::recursive_parser; |
Structs
RecursiveIndexes | |
RecursiveInfo | The type of payload used by recursive tracer |
Constants
RECURSIVE_STORAGE |
Traits
HasRecursiveInfo | Trait for recursive tracer |