Making a error recovery system

This commit is contained in:
2026-05-15 12:09:30 +02:00
parent 3aba4a359b
commit 216c61228c
5 changed files with 72 additions and 3 deletions
+65
View File
@@ -26,3 +26,68 @@ pub fn parse<'a>(source: &'a str) -> Result<Vec<TopLevel>, ParseError<'a, Vec<To
Ok(statements)
}
#[macro_export]
macro_rules! ast_expr {
($($item:ident)::+ { $($k:ident: $v:expr),* $(,)? }) => {{
let mut err = None;
let v = $($item)::+ {
$(
$k: {
let r = $v.get();
if let Err(e) = r {
err = Some(e.clone().get());
if let Some(recovered) = e.recovered {
Ok(recovered)
} else {
Err(e)
}
} else {
r
}
}.get()?
),*
};
if let Some(mut e) = err {
e.recovered = Some(v);
Err(e)
} else {
Ok(v)
}
}};
($($item:ident)::+ ( $($v:expr),* $(,)? )) => {{
let mut err = None;
let v = $($item)::+ ( $({
let r = $v.get();
if let Err(e) = r {
err = Some(e.clone().get());
if let Some(recovered) = e.recovered {
Ok(recovered)
} else {
Err(e)
}
} else {
r
}
}.get()?),* );
if let Some(mut e) = err {
e.recovered = Some(v);
Err(e)
} else {
Ok(v)
}
}};
($($item:ident)::+) => {
$($item)::+
};
}