@@ -135,15 +135,15 @@ tokenize([], EndLine, _Column, #elixir_tokenizer{terminators=[{Start, {StartLine
135
135
% Base integers
136
136
137
137
tokenize ([$0 , $x , H | T ], Line , Column , Scope , Tokens ) when ? is_hex (H ) ->
138
- {Rest , Number , Length } = tokenize_hex ([ H | T ] , [] ),
138
+ {Rest , Number , Length } = tokenize_hex (T , [H ], 1 ),
139
139
tokenize (Rest , Line , Column + 2 + Length , Scope , [{number , {Line , Column , Column + 2 + Length }, Number } | Tokens ]);
140
140
141
141
tokenize ([$0 , $b , H | T ], Line , Column , Scope , Tokens ) when ? is_bin (H ) ->
142
- {Rest , Number , Length } = tokenize_bin ([ H | T ] , [] ),
142
+ {Rest , Number , Length } = tokenize_bin (T , [H ], 1 ),
143
143
tokenize (Rest , Line , Column + 2 + Length , Scope , [{number , {Line , Column , Column + 2 + Length }, Number } | Tokens ]);
144
144
145
145
tokenize ([$0 , $o , H | T ], Line , Column , Scope , Tokens ) when ? is_octal (H ) ->
146
- {Rest , Number , Length } = tokenize_octal ([ H | T ] , [] ),
146
+ {Rest , Number , Length } = tokenize_octal (T , [H ], 1 ),
147
147
tokenize (Rest , Line , Column + 2 + Length , Scope , [{number , {Line , Column , Column + 2 + Length }, Number } | Tokens ]);
148
148
149
149
% Comments
@@ -413,8 +413,8 @@ tokenize([$. | T], Line, Column, Scope, Tokens) ->
413
413
414
414
% Integers and floats
415
415
416
- tokenize ([H | _ ] = String , Line , Column , Scope , Tokens ) when ? is_digit (H ) ->
417
- {Rest , Number , Length } = tokenize_number (String , [] , false ),
416
+ tokenize ([H | T ] , Line , Column , Scope , Tokens ) when ? is_digit (H ) ->
417
+ {Rest , Number , Length } = tokenize_number (T , [H ], 1 , false ),
418
418
tokenize (Rest , Line , Column + Length , Scope , [{number , {Line , Column , Column + Length }, Number } | Tokens ]);
419
419
420
420
% Identifiers (including aliases)
@@ -733,46 +733,55 @@ extract_heredoc_line(Marker, Rest, Buffer, _Counter) ->
733
733
% % At this point, we are at least sure the first digit is a number.
734
734
735
735
% % Check if we have a point followed by a number;
736
- tokenize_number ([$. , H | T ], Acc , false ) when ? is_digit (H ) ->
737
- tokenize_number (T , [H , $. | Acc ], true );
736
+ tokenize_number ([$. , H | T ], Acc , Length , false ) when ? is_digit (H ) ->
737
+ tokenize_number (T , [H , $. | Acc ], Length + 2 , true );
738
738
739
739
% % Check if we have an underscore followed by a number;
740
- tokenize_number ([$_ , H | T ], Acc , Bool ) when ? is_digit (H ) ->
741
- tokenize_number (T , [H | Acc ], Bool );
740
+ tokenize_number ([$_ , H | T ], Acc , Length , Bool ) when ? is_digit (H ) ->
741
+ tokenize_number (T , [H | Acc ], Length + 2 , Bool );
742
742
743
743
% % Check if we have e- followed by numbers (valid only for floats);
744
- tokenize_number ([E , S , H | T ], Acc , true )
744
+ tokenize_number ([E , S , H | T ], Acc , Length , true )
745
745
when (E == $E ) or (E == $e ), ? is_digit (H ), S == $+ orelse S == $- ->
746
- tokenize_number (T , [H , S , $e | Acc ], true );
746
+ tokenize_number (T , [H , S , $e | Acc ], Length + 3 , true );
747
747
748
748
% % Check if we have e followed by numbers (valid only for floats);
749
- tokenize_number ([E , H | T ], Acc , true )
749
+ tokenize_number ([E , H | T ], Acc , Length , true )
750
750
when (E == $E ) or (E == $e ), ? is_digit (H ) ->
751
- tokenize_number (T , [H , $e | Acc ], true );
751
+ tokenize_number (T , [H , $e | Acc ], Length + 2 , true );
752
752
753
753
% % Finally just numbers.
754
- tokenize_number ([H | T ], Acc , Bool ) when ? is_digit (H ) ->
755
- tokenize_number (T , [H | Acc ], Bool );
754
+ tokenize_number ([H | T ], Acc , Length , Bool ) when ? is_digit (H ) ->
755
+ tokenize_number (T , [H | Acc ], Length + 1 , Bool );
756
756
757
757
% % Cast to float...
758
- tokenize_number (Rest , Acc , true ) ->
759
- {Rest , list_to_float (lists :reverse (Acc )), length ( Acc ) };
758
+ tokenize_number (Rest , Acc , Length , true ) ->
759
+ {Rest , list_to_float (lists :reverse (Acc )), Length };
760
760
761
761
% % Or integer.
762
- tokenize_number (Rest , Acc , false ) ->
763
- {Rest , list_to_integer (lists :reverse (Acc )), length (Acc )}.
764
-
765
- tokenize_hex ([H | T ], Acc ) when ? is_hex (H ) -> tokenize_hex (T , [H | Acc ]);
766
- tokenize_hex ([$_ , H | T ], Acc ) when ? is_hex (H ) -> tokenize_hex (T , [H | Acc ]);
767
- tokenize_hex (Rest , Acc ) -> {Rest , list_to_integer (lists :reverse (Acc ), 16 ), length (Acc )}.
768
-
769
- tokenize_octal ([H | T ], Acc ) when ? is_octal (H ) -> tokenize_octal (T , [H | Acc ]);
770
- tokenize_octal ([$_ , H | T ], Acc ) when ? is_octal (H ) -> tokenize_octal (T , [H | Acc ]);
771
- tokenize_octal (Rest , Acc ) -> {Rest , list_to_integer (lists :reverse (Acc ), 8 ), length (Acc )}.
772
-
773
- tokenize_bin ([H | T ], Acc ) when ? is_bin (H ) -> tokenize_bin (T , [H | Acc ]);
774
- tokenize_bin ([$_ , H | T ], Acc ) when ? is_bin (H ) -> tokenize_bin (T , [H | Acc ]);
775
- tokenize_bin (Rest , Acc ) -> {Rest , list_to_integer (lists :reverse (Acc ), 2 ), length (Acc )}.
762
+ tokenize_number (Rest , Acc , Length , false ) ->
763
+ {Rest , list_to_integer (lists :reverse (Acc )), Length }.
764
+
765
+ tokenize_hex ([H | T ], Acc , Length ) when ? is_hex (H ) ->
766
+ tokenize_hex (T , [H | Acc ], Length + 1 );
767
+ tokenize_hex ([$_ , H | T ], Acc , Length ) when ? is_hex (H ) ->
768
+ tokenize_hex (T , [H | Acc ], Length + 2 );
769
+ tokenize_hex (Rest , Acc , Length ) ->
770
+ {Rest , list_to_integer (lists :reverse (Acc ), 16 ), Length }.
771
+
772
+ tokenize_octal ([H | T ], Acc , Length ) when ? is_octal (H ) ->
773
+ tokenize_octal (T , [H | Acc ], Length + 1 );
774
+ tokenize_octal ([$_ , H | T ], Acc , Length ) when ? is_octal (H ) ->
775
+ tokenize_octal (T , [H | Acc ], Length + 2 );
776
+ tokenize_octal (Rest , Acc , Length ) ->
777
+ {Rest , list_to_integer (lists :reverse (Acc ), 8 ), Length }.
778
+
779
+ tokenize_bin ([H | T ], Acc , Length ) when ? is_bin (H ) ->
780
+ tokenize_bin (T , [H | Acc ], Length + 1 );
781
+ tokenize_bin ([$_ , H | T ], Acc , Length ) when ? is_bin (H ) ->
782
+ tokenize_bin (T , [H | Acc ], Length + 2 );
783
+ tokenize_bin (Rest , Acc , Length ) ->
784
+ {Rest , list_to_integer (lists :reverse (Acc ), 2 ), Length }.
776
785
777
786
% % Comments
778
787
0 commit comments