Conditional compilation

LALRPOP support conditional compilation of non-terminal declarations via #[cfg(feature = "FEATURE")] attributes. If run in a build script LALRPOP will automatically pickup the features from cargo and use those. Alternatively an explicit set of features can be set using the Configuration type.

Like rust's cfg attribute, the syntax accepts not(), any() and all() arguments, even nested.

#![allow(unused)]
fn main() {
#[cfg(feature = "FEATURE")]
pub MyRule1 : () = {
    ...
};

#[cfg(any(feature = "FEATURE_A", all(not(feature = "FEATURE_B"), feature = "FEATURE_C")))]
pub MyRule2 : () = {
    ...
};

pub MyRule3: () = {
    #[cfg(feature = "FEATURE_A")]
    "A" => (),
    #[cfg(feature = "FEATURE_B")]
    "B" => (),
};
}

When using a custom lexer:

#![allow(unused)]
fn main() {
extern {
  type Location = usize;
  type Error = LexicalError;
  enum Token {
    "int" => Token::Integer(<i64>),
    "+" => Token::OperatorAdd,
    // Feature flag the left shift operator
    #[cfg(feature = "bit")]
    "<<" => Token::OperatorShl,
  }
}
}