@@ -992,20 +992,24 @@ protected function tokenize($string)
992992
993993 if ($ tokens [$ i ][0 ] === T_LNUMBER
994994 || $ tokens [$ i ][0 ] === T_DNUMBER
995- || ($ tokens [$ i ][0 ] === T_STRING
996- && $ tokens [$ i ][1 ][0 ] === '_ ' )
997995 ) {
998996 $ newContent .= $ tokens [$ i ][1 ];
997+ continue ;
998+ }
999999
1000- // Any T_DNUMBER token needs to make the
1001- // new number a T_DNUMBER as well.
1002- if ($ tokens [$ i ][0 ] === T_DNUMBER ) {
1003- $ newType = T_DNUMBER ;
1004- }
1000+ if ($ tokens [$ i ][0 ] === T_STRING
1001+ && $ tokens [$ i ][1 ][0 ] === '_ '
1002+ && ((strpos ($ newContent , '0x ' ) === 0
1003+ && preg_match ('`^((?<!\.)_[0-9A-F][0-9A-F\.]*)+$`iD ' , $ tokens [$ i ][1 ]) === 1 )
1004+ || (strpos ($ newContent , '0x ' ) !== 0
1005+ && substr ($ newContent , -1 ) !== '. '
1006+ && substr (strtolower ($ newContent ), -1 ) !== 'e '
1007+ && preg_match ('`^(?:(?<![\.e])_[0-9][0-9e\.]*)+$`iD ' , $ tokens [$ i ][1 ]) === 1 ))
1008+ ) {
1009+ $ newContent .= $ tokens [$ i ][1 ];
10051010
10061011 // Support floats.
1007- if ($ tokens [$ i ][0 ] === T_STRING
1008- && substr (strtolower ($ tokens [$ i ][1 ]), -1 ) === 'e '
1012+ if (substr (strtolower ($ tokens [$ i ][1 ]), -1 ) === 'e '
10091013 && ($ tokens [($ i + 1 )] === '- '
10101014 || $ tokens [($ i + 1 )] === '+ ' )
10111015 ) {
@@ -1019,9 +1023,21 @@ protected function tokenize($string)
10191023 break ;
10201024 }//end for
10211025
1026+ if ($ newType === T_LNUMBER
1027+ && ((stripos ($ newContent , '0x ' ) === 0 && hexdec (str_replace ('_ ' , '' , $ newContent )) > PHP_INT_MAX )
1028+ || (stripos ($ newContent , '0b ' ) === 0 && bindec (str_replace ('_ ' , '' , $ newContent )) > PHP_INT_MAX )
1029+ || (stripos ($ newContent , '0x ' ) !== 0
1030+ && stripos ($ newContent , 'e ' ) !== false || strpos ($ newContent , '. ' ) !== false )
1031+ || (strpos ($ newContent , '0 ' ) === 0 && stripos ($ newContent , '0x ' ) !== 0
1032+ && stripos ($ newContent , '0b ' ) !== 0 && octdec (str_replace ('_ ' , '' , $ newContent )) > PHP_INT_MAX )
1033+ || (strpos ($ newContent , '0 ' ) !== 0 && str_replace ('_ ' , '' , $ newContent ) > PHP_INT_MAX ))
1034+ ) {
1035+ $ newType = T_DNUMBER ;
1036+ }
1037+
10221038 $ newToken = [];
10231039 $ newToken ['code ' ] = $ newType ;
1024- $ newToken ['type ' ] = Util \Tokens::tokenName ($ token [ 0 ] );
1040+ $ newToken ['type ' ] = Util \Tokens::tokenName ($ newType );
10251041 $ newToken ['content ' ] = $ newContent ;
10261042 $ finalTokens [$ newStackPtr ] = $ newToken ;
10271043
0 commit comments