Working error recovery

This commit is contained in:
2026-05-15 22:06:09 +02:00
parent efe32d8e5f
commit 6346ffc771
3 changed files with 10 additions and 8 deletions
-2
View File
@@ -1,6 +1,4 @@
void main() {
app_instance.boot();
app_instance.run();
hi
}
+7 -2
View File
@@ -18,13 +18,18 @@ pub fn parse<'a>(source: &'a str) -> Result<Vec<TopLevel>, ParseError<'a, Vec<To
let mut statements = vec![];
let mut analyzer = error::AstErrorAnalyzer(None);
for pair in pairs.next().unwrap().into_inner() {
if pair.as_rule() != Rule::EOI {
statements.push(TopLevel::try_from(pair).get()?);
statements.push(analyzer.get(TopLevel::try_from(pair)).get()?);
}
}
Ok(statements)
match analyzer.build(statements) {
Ok(v) => Ok(v),
Err(e) => Err(ParseError::Ast(e)),
}
}
#[macro_export]
+3 -4
View File
@@ -18,14 +18,13 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for TopLevel {
fn try_from(pair: pest::iterators::Pair<'a, Rule>) -> Result<Self, Self::Error> {
let mut inner = pair.into_inner();
let attributes = collect_recovered(inner.next().unwrap().into_inner()).get()?;
let attributes = collect_recovered(inner.next().unwrap().into_inner());
Ok(TopLevel(
ast_expr!(TopLevel(
inner
.next()
.map(TopLevelKind::try_from)
.unwrap_or(Ok(TopLevelKind::ModAttribute))
.get()?,
.unwrap_or(Ok(TopLevelKind::ModAttribute)),
attributes,
))
}