diff --git a/crates/prolog_parser/src/lexer.rs b/crates/prolog_parser/src/lexer.rs index 8bd77d5b..5c355705 100644 --- a/crates/prolog_parser/src/lexer.rs +++ b/crates/prolog_parser/src/lexer.rs @@ -559,16 +559,37 @@ impl<'a, R: Read> Lexer<'a, R> { Token::Constant(Constant::Float(result)) } + fn skip_underscore_in_number(&mut self) -> Result { + let mut c = self.lookahead_char()?; + + if c == '_' { + self.skip_char()?; + c = self.lookahead_char()?; + while layout_char!(c) { + self.skip_char()?; + c = self.lookahead_char()?; + } + + if decimal_digit_char!(c) { + Ok(c) + } else { + Err(ParserError::ParseBigInt(self.line_num, self.col_num)) + } + } else { + Ok(c) + } + } + pub fn number_token(&mut self) -> Result { let mut token = String::new(); token.push(self.skip_char()?); - let mut c = self.lookahead_char()?; + let mut c = self.skip_underscore_in_number()?; while decimal_digit_char!(c) { token.push(c); self.skip_char()?; - c = self.lookahead_char()?; + c = self.skip_underscore_in_number()?; } if decimal_point_char!(c) {