Browse Source

Allow numbers without decimal digits to be followed by a dot (#27)

pull/37/head
Damian Senn 5 years ago committed by Jason Williams
parent
commit
2b334a21d1
  1. 37
      src/lib/syntax/lexer.rs

37
src/lib/syntax/lexer.rs

@ -391,14 +391,26 @@ impl<'a> Lexer<'a> {
} }
_ if ch.is_digit(10) => { _ if ch.is_digit(10) => {
let mut buf = ch.to_string(); let mut buf = ch.to_string();
loop { 'digitloop: loop {
// There might not be a next character // There might not be a next character
let ch = match self.preview_next() { let ch = match self.preview_next() {
Some(c) => c, Some(c) => c,
None => break, None => break,
}; };
match ch { match ch {
'.' | 'e' | '+' | '-' => { '.' => loop {
buf.push(self.next()?);
let ch = match self.preview_next() {
Some(ch) => ch,
None => break,
};
if !ch.is_digit(10) {
break 'digitloop;
}
},
'e' | '+' | '-' => {
buf.push(self.next()?); buf.push(self.next()?);
} }
_ if ch.is_digit(10) => { _ if ch.is_digit(10) => {
@ -885,19 +897,20 @@ mod tests {
#[test] #[test]
fn numbers() { fn numbers() {
let mut lexer = Lexer::new("1 2 0x34 056 7.89 5e3 5e+3 5e-3 0b10 0O123 0999"); let mut lexer = Lexer::new("1 2 0x34 056 7.89 42. 5e3 5e+3 5e-3 0b10 0O123 0999");
lexer.lex().unwrap(); lexer.lex().unwrap();
assert_eq!(lexer.tokens[0].data, TokenData::NumericLiteral(1.0)); assert_eq!(lexer.tokens[0].data, TokenData::NumericLiteral(1.0));
assert_eq!(lexer.tokens[1].data, TokenData::NumericLiteral(2.0)); assert_eq!(lexer.tokens[1].data, TokenData::NumericLiteral(2.0));
assert_eq!(lexer.tokens[2].data, TokenData::NumericLiteral(52.0)); assert_eq!(lexer.tokens[2].data, TokenData::NumericLiteral(52.0));
assert_eq!(lexer.tokens[3].data, TokenData::NumericLiteral(46.0)); assert_eq!(lexer.tokens[3].data, TokenData::NumericLiteral(46.0));
assert_eq!(lexer.tokens[4].data, TokenData::NumericLiteral(7.89)); assert_eq!(lexer.tokens[4].data, TokenData::NumericLiteral(7.89));
assert_eq!(lexer.tokens[5].data, TokenData::NumericLiteral(5000.0)); assert_eq!(lexer.tokens[5].data, TokenData::NumericLiteral(42.0));
assert_eq!(lexer.tokens[6].data, TokenData::NumericLiteral(5000.0)); assert_eq!(lexer.tokens[6].data, TokenData::NumericLiteral(5000.0));
assert_eq!(lexer.tokens[7].data, TokenData::NumericLiteral(0.005)); assert_eq!(lexer.tokens[7].data, TokenData::NumericLiteral(5000.0));
assert_eq!(lexer.tokens[8].data, TokenData::NumericLiteral(2.0)); assert_eq!(lexer.tokens[8].data, TokenData::NumericLiteral(0.005));
assert_eq!(lexer.tokens[9].data, TokenData::NumericLiteral(83.0)); assert_eq!(lexer.tokens[9].data, TokenData::NumericLiteral(2.0));
assert_eq!(lexer.tokens[10].data, TokenData::NumericLiteral(999.0)); assert_eq!(lexer.tokens[10].data, TokenData::NumericLiteral(83.0));
assert_eq!(lexer.tokens[11].data, TokenData::NumericLiteral(999.0));
} }
#[test] #[test]
@ -907,4 +920,12 @@ mod tests {
dbg!(lexer.tokens); dbg!(lexer.tokens);
} }
#[test]
fn test_number_followed_by_dot() {
let mut lexer = Lexer::new("1..");
lexer.lex().unwrap();
assert_eq!(lexer.tokens[0].data, TokenData::NumericLiteral(1.0));
assert_eq!(lexer.tokens[1].data, TokenData::Punctuator(Punctuator::Dot));
}
} }

Loading…
Cancel
Save