From 746f3d5eefaf0d6e0de477a1bf6af429973af8e7 Mon Sep 17 00:00:00 2001 From: "Guillem L. Jara" <4lon3ly0@tutanota.com> Date: Thu, 7 May 2026 18:00:56 +0200 Subject: [PATCH] parser: tighten error reporting --- parser/src/diagnostics.rs | 2 +- parser/src/lex.rs | 4 ++-- parser/src/lib.rs | 14 ++++++++++++-- parser/src/pratt.rs | 5 ++++- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/parser/src/diagnostics.rs b/parser/src/diagnostics.rs index 08ecdea..da53d6c 100644 --- a/parser/src/diagnostics.rs +++ b/parser/src/diagnostics.rs @@ -149,7 +149,7 @@ pub fn report_error<'a>( name: &'a str, source: &'a [u8], ) -> super::AriadneErr<'a> { - let span = error.span().unwrap(); + let span = error.span().unwrap_or(source.len()..source.len()); let source = str::from_utf8(source).unwrap(); let mut report = Report::build(ReportKind::Error, (name, span.clone())) .with_message("Syntax error") diff --git a/parser/src/lex.rs b/parser/src/lex.rs index 6430a92..d7e9a22 100644 --- a/parser/src/lex.rs +++ b/parser/src/lex.rs @@ -53,7 +53,7 @@ impl<'a> Lexer<'a> { Some(Ok(tok)) if expected == &tok => Ok(tok), Some(Ok(_)) => Err(err(self.span())), Some(err @ Err(_)) => err.map_err(Into::into), - None => todo!(), + None => Err(ParsingError::LexingError(LexingError::UnexpectedEof)), } } @@ -66,7 +66,7 @@ impl<'a> Lexer<'a> { Some(Ok(tok)) if expected(&tok) => Ok(tok), Some(Ok(_)) => Err(ParsingError::UnexpectedToken(self.span(), msg)), Some(err @ Err(_)) => err.map_err(Into::into), - None => todo!(), + None => Err(ParsingError::LexingError(LexingError::UnexpectedEof)), } } diff --git a/parser/src/lib.rs b/parser/src/lib.rs index 7ae7032..b75f119 100644 --- a/parser/src/lib.rs +++ b/parser/src/lib.rs @@ -157,7 +157,12 @@ impl<'a> Parser<'a> { )); } Token::Newline | Token::Semicolon => {} - x => unimplemented!("{x:?}"), + _ => { + return Err(ParsingError::UnexpectedToken( + lex.span(), + "invalid rule beginning.".into(), + )); + } } } } @@ -362,7 +367,12 @@ impl<'a> Parser<'a> { .then(|| self.parse_expression(lex)) .transpose()?, ), - a => todo!("{a:?}"), + _ => { + return Err(ParsingError::UnexpectedToken( + lex.span(), + "invalid statement start.".into(), + )); + } } }; diff --git a/parser/src/pratt.rs b/parser/src/pratt.rs index 43e296c..a41879f 100644 --- a/parser/src/pratt.rs +++ b/parser/src/pratt.rs @@ -163,7 +163,10 @@ impl<'a, 'b> Pratt<'a, 'b> { self.parser .parse_function_call(lex, name.qualify(self.parser.namespace), lex.span()) } else { - Ok(Expr::leaf(self.parser.parse_atom(lex, next)?)) + match self.parser.parse_atom(lex, next) { + Ok(atom) => Ok(Expr::leaf(atom)), + Err(_) => Err(ParsingError::InvalidExpression(lex.span())), + } } }