Merge pull request #1112 from triska/underscores_in_integers

ENHANCED: Support '_' followed by layout text sequence in integers.
This commit is contained in:
Mark Thom
2021-11-27 20:29:49 -05:00
committed by GitHub

View File

@@ -559,16 +559,37 @@ impl<'a, R: Read> Lexer<'a, R> {
Token::Constant(Constant::Float(result)) Token::Constant(Constant::Float(result))
} }
fn skip_underscore_in_number(&mut self) -> Result<char, ParserError> {
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<Token, ParserError> { pub fn number_token(&mut self) -> Result<Token, ParserError> {
let mut token = String::new(); let mut token = String::new();
token.push(self.skip_char()?); token.push(self.skip_char()?);
let mut c = self.lookahead_char()?; let mut c = self.skip_underscore_in_number()?;
while decimal_digit_char!(c) { while decimal_digit_char!(c) {
token.push(c); token.push(c);
self.skip_char()?; self.skip_char()?;
c = self.lookahead_char()?; c = self.skip_underscore_in_number()?;
} }
if decimal_point_char!(c) { if decimal_point_char!(c) {