diff --git a/src/parser.rs b/src/parser.rs index c23c65a3..0f62ee1e 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -991,9 +991,18 @@ impl<'a> TokenIterator<'a> { } } - let has_letter = result.iter().any(char::is_ascii_alphabetic); + let is_valid_identifier = result + .iter() + .find(|&ch| char::is_ascii_alphanumeric(ch)) // first alpha-numeric character + .map(char::is_ascii_alphabetic) // is a letter + .unwrap_or(false); // if no alpha-numeric at all - syntax error + let identifier: String = result.iter().collect(); + if !is_valid_identifier { + return Some((Token::LexError(LERR::MalformedIdentifier(identifier)), pos)); + } + return Some(( match identifier.as_str() { "true" => Token::True, @@ -1013,9 +1022,7 @@ impl<'a> TokenIterator<'a> { #[cfg(not(feature = "no_function"))] "fn" => Token::Fn, - _ if has_letter => Token::Identifier(identifier), - - _ => Token::LexError(LERR::MalformedIdentifier(identifier)), + _ => Token::Identifier(identifier), }, pos, ));