Macro syn::alt[][src]

macro_rules! alt {
    ($i:expr, $e:ident | $($rest:tt)*) => { ... };
    ($i:expr, $subrule:ident!( $($args:tt)*) | $($rest:tt)*) => { ... };
    ($i:expr, $subrule:ident!( $($args:tt)* ) => { $gen:expr } | $($rest:tt)+) => { ... };
    ($i:expr, $e:ident => { $gen:expr } | $($rest:tt)*) => { ... };
    ($i:expr, $e:ident => { $gen:expr }) => { ... };
    ($i:expr, $subrule:ident!( $($args:tt)* ) => { $gen:expr }) => { ... };
    ($i:expr, $e:ident) => { ... };
    ($i:expr, $subrule:ident!( $($args:tt)*)) => { ... };
}

Run a series of parsers, returning the result of the first one which succeeds.

Optionally allows for the result to be transformed.

  • Syntax: alt!(THING1 | THING2 => { FUNC } | ...)
  • Output: T, the return type of THING1 and FUNC(THING2) and ...

Example

#[macro_use]
extern crate syn;
extern crate proc_macro2;

use proc_macro2::{Ident, Span};

// Parse any identifier token, or the `!` token in which case the
// identifier is treated as `"BANG"`.
named!(ident_or_bang -> Ident, alt!(
    syn!(Ident)
    |
    punct!(!) => { |_| Ident::new("BANG", Span::call_site()) }
));

The alt! macro is most commonly seen when parsing a syntax tree enum such as the Item enum.

impl Synom for Item {
    named!(parse -> Self, alt!(
        syn!(ItemExternCrate) => { Item::ExternCrate }
        |
        syn!(ItemUse) => { Item::Use }
        |
        syn!(ItemStatic) => { Item::Static }
        |
        syn!(ItemConst) => { Item::Const }
        |
        /* ... */
    ));
}

This macro is available if Syn is built with the "parsing" feature.