nom::alt! [] [src]

macro_rules! alt {
    ($i:expr, $($rest:tt)*) => { ... };
}

alt!(I -> IResult<I,O> | I -> IResult<I,O> | ... | I -> IResult<I,O> ) => I -> IResult<I, O> try a list of parser, return the result of the first successful one

Incomplete results are ignored

 named!( test, alt!( tag!( "abcd" ) | tag!( "efgh" ) ) );
 let r1 = test(b"abcdefgh");
 assert_eq!(r1, Done(&b"efgh"[..], &b"abcd"[..]));
 let r2 = test(&b"efghijkl"[..]);
 assert_eq!(r2, Done(&b"ijkl"[..], &b"efgh"[..]));

There is another syntax for alt allowing a block to manipulate the result:

    #[derive(Debug,PartialEq,Eq)]
    enum Tagged {
      Abcd,
      Efgh,
      Took(usize)
    }
    named!(test<Tagged>, alt!(
        tag!("abcd") => { |_|          Tagged::Abcd }
      | tag!("efgh") => { |_|          Tagged::Efgh }
      | take!(5)     => { |res: &[u8]| Tagged::Took(res.len()) } // the closure takes the result as argument if the parser is successful
    ));
    let r1 = test(b"abcdefgh");
    assert_eq!(r1, Done(&b"efgh"[..], Tagged::Abcd));
    let r2 = test(&b"efghijkl"[..]);
    assert_eq!(r2, Done(&b"ijkl"[..], Tagged::Efgh));
    let r3 = test(&b"mnopqrst"[..]);
    assert_eq!(r3, Done(&b"rst"[..],  Tagged::Took(5)));