@@ -79,7 +79,7 @@ impl<'a> Scanner<'a> {
7979 _ => Err ( self . create_error_for_current_token ( ParseErrorKind :: UnexpectedToken ) ) ,
8080 } ,
8181 _ => {
82- if current_char == '-' || self . is_digit ( ) {
82+ if current_char == '-' || current_char == '+' || self . is_digit ( ) {
8383 self . parse_number ( )
8484 } else if self . try_move_word ( "true" ) {
8585 Ok ( Token :: Boolean ( true ) )
@@ -154,7 +154,8 @@ impl<'a> Scanner<'a> {
154154 fn parse_number ( & mut self ) -> Result < Token < ' a > , ParseError > {
155155 let start_byte_index = self . byte_index ;
156156
157- if self . is_negative_sign ( ) {
157+ // handle unary plus or minus
158+ if self . is_negative_sign ( ) || self . is_positive_sign ( ) {
158159 self . move_next_char ( ) ;
159160 }
160161
@@ -423,6 +424,10 @@ impl<'a> Scanner<'a> {
423424 self . current_char ( ) == Some ( '-' )
424425 }
425426
427+ fn is_positive_sign ( & self ) -> bool {
428+ self . current_char ( ) == Some ( '+' )
429+ }
430+
426431 fn is_decimal_point ( & self ) -> bool {
427432 self . current_char ( ) == Some ( '.' )
428433 }
@@ -540,6 +545,22 @@ mod tests {
540545 ) ;
541546 }
542547
548+ #[ test]
549+ fn it_tokenizes_unary_plus_numbers ( ) {
550+ assert_has_tokens (
551+ "+42, +0.5, +1e10, +0xFF" ,
552+ vec ! [
553+ Token :: Number ( "+42" ) ,
554+ Token :: Comma ,
555+ Token :: Number ( "+0.5" ) ,
556+ Token :: Comma ,
557+ Token :: Number ( "+1e10" ) ,
558+ Token :: Comma ,
559+ Token :: Number ( "+0xFF" ) ,
560+ ] ,
561+ ) ;
562+ }
563+
543564 #[ test]
544565 fn it_errors_invalid_exponent ( ) {
545566 assert_has_error (
0 commit comments