|
|
@ -336,6 +336,17 @@ impl<'a> Lexer<'a> { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
u64::from_str_radix(&buf, 16).unwrap() |
|
|
|
u64::from_str_radix(&buf, 16).unwrap() |
|
|
|
|
|
|
|
} else if self.next_is('b')? { |
|
|
|
|
|
|
|
loop { |
|
|
|
|
|
|
|
let ch = self.preview_next()?; |
|
|
|
|
|
|
|
match ch { |
|
|
|
|
|
|
|
ch if ch.is_digit(2) => { |
|
|
|
|
|
|
|
buf.push(self.next()?); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
_ => break, |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
u64::from_str_radix(&buf, 2).unwrap() |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
let mut gone_decimal = false; |
|
|
|
let mut gone_decimal = false; |
|
|
|
loop { |
|
|
|
loop { |
|
|
@ -345,6 +356,9 @@ impl<'a> Lexer<'a> { |
|
|
|
buf.push(ch); |
|
|
|
buf.push(ch); |
|
|
|
self.next()?; |
|
|
|
self.next()?; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
'O' | 'o' => { |
|
|
|
|
|
|
|
self.next()?; |
|
|
|
|
|
|
|
} |
|
|
|
'8' | '9' | '.' => { |
|
|
|
'8' | '9' | '.' => { |
|
|
|
gone_decimal = true; |
|
|
|
gone_decimal = true; |
|
|
|
buf.push(ch); |
|
|
|
buf.push(ch); |
|
|
@ -374,7 +388,7 @@ impl<'a> Lexer<'a> { |
|
|
|
Err(_) => break, |
|
|
|
Err(_) => break, |
|
|
|
}; |
|
|
|
}; |
|
|
|
match ch { |
|
|
|
match ch { |
|
|
|
'.' => { |
|
|
|
'.' | 'e' | '+' | '-' => { |
|
|
|
buf.push(self.next()?); |
|
|
|
buf.push(self.next()?); |
|
|
|
} |
|
|
|
} |
|
|
|
_ if ch.is_digit(10) => { |
|
|
|
_ if ch.is_digit(10) => { |
|
|
@ -579,16 +593,21 @@ mod tests { |
|
|
|
); |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// TODO: Missing support for 5e3 5e+3 5e-3 0b10 0O123 0999 (octal notation)
|
|
|
|
|
|
|
|
#[test] |
|
|
|
#[test] |
|
|
|
fn numbers() { |
|
|
|
fn numbers() { |
|
|
|
let mut lexer = Lexer::new("1 2 0x34 056 7.89;"); |
|
|
|
let mut lexer = Lexer::new("1 2 0x34 056 7.89 5e3 5e+3 5e-3 0b10 0O123 0999;"); |
|
|
|
lexer.lex().expect("finished"); |
|
|
|
lexer.lex().expect("finished"); |
|
|
|
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[6].data, TokenData::NumericLiteral(5000.0)); |
|
|
|
|
|
|
|
assert_eq!(lexer.tokens[7].data, TokenData::NumericLiteral(0.005)); |
|
|
|
|
|
|
|
assert_eq!(lexer.tokens[8].data, TokenData::NumericLiteral(2.0)); |
|
|
|
|
|
|
|
assert_eq!(lexer.tokens[9].data, TokenData::NumericLiteral(83.0)); |
|
|
|
|
|
|
|
assert_eq!(lexer.tokens[10].data, TokenData::NumericLiteral(999.0)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#[test] |
|
|
|
#[test] |
|
|
|