capgen/src/macros.rs
2020-09-24 03:54:08 -05:00

46 lines
1 KiB
Rust

macro_rules! string {
($x:ident) => {
stringify!($x).to_owned()
};
}
macro_rules! make_grammar {
(
// comma-separated grammar rules
$(
$lhs:ident
->
$(
$($arg:ident)*
)|* $(|)?
),* $(,)?
// backslash for terminals
$(
%
$(
$lhs_:ident
->
$re:expr
),* $(,)?
)?
) => {
crate::grammar::Grammar {
start: hashset!{ $(string!($lhs),)* },
productions: hashmap!{
$(string!($lhs) => vec![
$(vec![
$(string!($arg),)*
],)*
],)*
},
terminals: hashmap!{
$(
$(string!($lhs_) => regex::Regex::new($re).unwrap(),)*
)?
},
first_sets: crate::utils::MapOfSet::default(),
}
};
}