From: Markus Triska Date: Sat, 27 Nov 2021 08:11:41 +0000 (+0100) Subject: ENHANCED: Support '_' followed by layout text sequence in integers. X-Git-Tag: v0.9.0~20^2 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=1647e67dd4e820043f17fde3a9f263df8fc40bdc;p=scryer-prolog.git ENHANCED: Support '_' followed by layout text sequence in integers. This is handy for writing large integers, for example in cryptographic applications. This addresses #994. Examples: ?- X = 1_000_000. %@ X = 1000000. ?- X = 1_ 000_ 000. %@ X = 1000000. --- 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) {