only check 'e' in eat_number

This commit is contained in:
TcMits
2025-09-05 13:08:42 +07:00
parent 168f6dcbb5
commit 4726ffaa74

View File

@@ -207,7 +207,7 @@ impl<'a> Iterator for Lexer<'a> {
b'&' => Some(Ok(self.eat_one_token(TokenType::TK_BITAND))),
b'~' => Some(Ok(self.eat_one_token(TokenType::TK_BITNOT))),
b'\'' | b'"' | b'`' => Some(self.mark(|l| l.eat_lit_or_id())),
b'.' => Some(self.mark(|l| l.eat_dot_or_frac())),
b'.' => Some(self.mark(|l| l.eat_dot_or_frac(false))),
b'0'..=b'9' => Some(self.mark(|l| l.eat_number())),
b'[' => Some(self.mark(|l| l.eat_bracket())),
b'?' | b'$' | b'@' | b'#' | b':' => Some(self.mark(|l| l.eat_var())),
@@ -585,12 +585,14 @@ impl<'a> Lexer<'a> {
})
}
fn eat_dot_or_frac(&mut self) -> Result<Token<'a>> {
fn eat_dot_or_frac(&mut self, has_digit_prefix: bool) -> Result<Token<'a>> {
let start = self.offset;
self.eat_and_assert(|b| b == b'.');
match self.peek() {
Some(b) if b.is_ascii_digit() || b.eq_ignore_ascii_case(&b'e') => {
Some(b)
if b.is_ascii_digit() || (has_digit_prefix && b.eq_ignore_ascii_case(&b'e')) =>
{
self.eat_while_number_digit()?;
match self.peek() {
Some(b'e') | Some(b'E') => {
@@ -677,7 +679,7 @@ impl<'a> Lexer<'a> {
self.eat_while_number_digit()?;
match self.peek() {
Some(b'.') => {
self.eat_dot_or_frac()?;
self.eat_dot_or_frac(true)?;
Ok(Token {
value: &self.input[start..self.offset],
token_type: Some(TokenType::TK_FLOAT),
@@ -1521,6 +1523,24 @@ mod tests {
},
],
),
// issue 2933
(
b"u.name".as_slice(),
vec![
Token {
value: b"u".as_slice(),
token_type: Some(TokenType::TK_ID),
},
Token {
value: b".".as_slice(),
token_type: Some(TokenType::TK_DOT),
},
Token {
value: b"name".as_slice(),
token_type: Some(TokenType::TK_ID),
},
],
),
];
for (input, expected_tokens) in test_cases {