Making a error recovery system
This commit is contained in:
@@ -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)::+
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user