From 4efceda8c5f6ef7d85d30fe3455e1f1b12056498 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Mon, 14 Jul 2025 23:05:10 -0700 Subject: [PATCH] fix parsing partial number tokens in other radixes (#3000) --- src/parser/lexer.rs | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/parser/lexer.rs b/src/parser/lexer.rs index 2b63380c..5fd5b7ba 100644 --- a/src/parser/lexer.rs +++ b/src/parser/lexer.rs @@ -508,7 +508,13 @@ impl<'a, R: CharRead> Lexer<'a, R> { if hexadecimal_digit_char!(c) { self.skip_char(c); token.push(c); - c = try_nt!(token, self.lookahead_char()); + c = match self.lookahead_char() { + Ok(c) => c, + Err(e) if e.is_unexpected_eof() => { + break; + } + Err(e) => return Err(e), + }; } else { break; } @@ -533,7 +539,13 @@ impl<'a, R: CharRead> Lexer<'a, R> { if octal_digit_char!(c) { self.skip_char(c); token.push(c); - c = try_nt!(token, self.lookahead_char()); + c = match self.lookahead_char() { + Ok(c) => c, + Err(e) if e.is_unexpected_eof() => { + break; + } + Err(e) => return Err(e), + }; } else { break; } @@ -558,7 +570,13 @@ impl<'a, R: CharRead> Lexer<'a, R> { if binary_digit_char!(c) { self.skip_char(c); token.push(c); - c = try_nt!(token, self.lookahead_char()); + c = match self.lookahead_char() { + Ok(c) => c, + Err(e) if e.is_unexpected_eof() => { + break; + } + Err(e) => return Err(e), + }; } else { break; } @@ -662,9 +680,7 @@ impl<'a, R: CharRead> Lexer<'a, R> { fn vacate_with_float(&mut self, mut token: String) -> Result { self.return_char(token.pop().unwrap()); - let n = parse_float_lossy(&token)?; - Ok(Number::Float(float_alloc!(n, self.machine_st.arena))) } @@ -686,12 +702,8 @@ impl<'a, R: CharRead> Lexer<'a, R> { } } - fn parse_integer_by_radix( - &mut self, - token: &String, - radix: u32, - ) -> Result { - i64::from_str_radix(&token, radix) + fn parse_integer_by_radix(&mut self, token: &str, radix: u32) -> Result { + i64::from_str_radix(token, radix) .map(|n| { Fixnum::build_with_checked(n) .map(Number::Fixnum) @@ -708,7 +720,7 @@ impl<'a, R: CharRead> Lexer<'a, R> { } #[inline] - fn parse_integer(&mut self, token: &String) -> Result { + fn parse_integer(&mut self, token: &str) -> Result { self.parse_integer_by_radix(token, 10) } -- 2.54.0