Ast expression macro

This commit is contained in:
2026-05-15 01:24:55 +02:00
parent 25f4b5470d
commit 80e17ffafb
5 changed files with 81 additions and 39 deletions
+48
View File
@@ -26,3 +26,51 @@ pub fn parse<'a>(source: &'a str) -> Result<Vec<TopLevel>, ParseError<'a, Vec<To
Ok(statements)
}
#[macro_export]
macro_rules! ast_expr {
($inner:tt@$item:path { $($name:ident $t:tt $val:tt $($val2:tt)?),*}) => {{
$(
let $name = $crate::_ast_t!($t $crate::_ast_ti!($inner, $val $($val2)?));
)*
$item { $($name,)* }
}};
}
#[macro_export]
macro_rules! _ast_t {
(: $val:expr) => {
$val.get()?
};
(? $val:expr) => {
$val.or_else(|e| {
if let Some(recovered) = e.recovered {
Ok(recovered)
} else {
Err(e)
}
})
.get()?
};
}
#[macro_export]
macro_rules! _ast_ti {
($inner:ident, ! $val:ident) => {
$val::try_from(&mut $inner)
};
($inner:ident, @ $val:ident) => {
$val::try_from($inner.next().unwrap())
};
($inner:ident, ? ($rule:path)) => {
$crate::parser::listen_rule(&mut $inner, $rule)
};
($inner:ident, & $val:expr) => {
$val
};
}