Compare commits

..

2 Commits

Author SHA1 Message Date
Jesse Brault
4e3f1677be Fixed some lexer/parser bugs related to lexer errors. 2026-08-21 13:50:44 -05:00
Jesse Brault
6ac075ffd0 Parser refactoring to use new (Maybe)ParseResult types, WIP. 2026-08-21 13:18:20 -05:00
3 changed files with 510 additions and 454 deletions

View File

@ -105,12 +105,14 @@ fn compile_statement(
register_count: usize,
constants_table: &mut ConstantsTable,
) -> Result<Function, Diagnostics> {
let (maybe_statement, parse_diagnostics) = parse_statement(input);
if !parse_diagnostics.is_empty() {
Err(parse_diagnostics)
} else if let Some(statement) = maybe_statement {
session.compile_statement(&statement, register_count, constants_table)
let maybe_statement = parse_statement(input);
if !maybe_statement.is_ok() {
Err(maybe_statement.into_diagnostics())
} else {
panic!("Unable to unwrap statement from previous input.")
session.compile_statement(
&maybe_statement.into_inner(),
register_count,
constants_table,
)
}
}

View File

@ -118,11 +118,10 @@ impl<'a> Lexer<'a> {
}
}
if !terminated {
return Some(Err(LexerError::new(
self.position,
end,
LexerErrorKind::UnterminatedString,
)));
let err =
LexerError::new(self.position, end, LexerErrorKind::UnterminatedString);
self.position = end;
return Some(Err(err));
}
(end, TokenKind::String)
} else {
@ -137,11 +136,13 @@ impl<'a> Lexer<'a> {
}
if prefix.len() == 0 {
return Some(Err(LexerError::new(
let err = LexerError::new(
self.position,
self.position + 1,
LexerErrorKind::UnrecognizedCharacter(chunk.chars().next().unwrap()),
)));
);
self.position += 1;
return Some(Err(err));
}
let token_kind = match prefix.as_str() {

File diff suppressed because it is too large Load Diff