@@ -719,14 +719,13 @@ final class Tokenizer
719
719
];
720
720
721
721
// Regular expressions for tokenizing
722
-
723
- private readonly string $ nextTokenRegexNumber ;
724
- private readonly string $ nextTokenRegexBoundaryCharacter ;
725
- private readonly string $ nextTokenRegexReservedToplevel ;
726
- private readonly string $ nextTokenRegexReservedNewline ;
727
- private readonly string $ nextTokenRegexReserved ;
728
- private readonly string $ nextTokenRegexFunction ;
729
- private readonly string $ nextTokenRegexNonReserved ;
722
+ private static string $ nextTokenRegexNumber ;
723
+ private static string $ nextTokenRegexBoundaryCharacter ;
724
+ private static string $ nextTokenRegexReservedToplevel ;
725
+ private static string $ nextTokenRegexReservedNewline ;
726
+ private static string $ nextTokenRegexReserved ;
727
+ private static string $ nextTokenRegexFunction ;
728
+ private static string $ nextTokenRegexNonReserved ;
730
729
731
730
/**
732
731
* Punctuation that can be used as a boundary between other tokens
@@ -762,20 +761,24 @@ final class Tokenizer
762
761
*/
763
762
public function __construct ()
764
763
{
764
+ if (isset (self ::$ nextTokenRegexNumber )) {
765
+ return ;
766
+ }
767
+
765
768
// Set up regular expressions
766
769
$ regexBoundaries = $ this ->makeRegexFromList ($ this ->boundaries );
767
770
$ regexReserved = $ this ->makeRegexFromList ($ this ->reserved );
768
771
$ regexReservedToplevel = str_replace (' ' , '\s+ ' , $ this ->makeRegexFromList ($ this ->reservedToplevel ));
769
772
$ regexReservedNewline = str_replace (' ' , '\s+ ' , $ this ->makeRegexFromList ($ this ->reservedNewline ));
770
773
$ regexFunction = $ this ->makeRegexFromList ($ this ->functions );
771
774
772
- $ this -> nextTokenRegexNumber = '/\G(?:\d+(?:\.\d+)?|0x[\da-fA-F]+|0b[01]+)(?=$|\s|" \'`| ' . $ regexBoundaries . ')/ ' ;
773
- $ this -> nextTokenRegexBoundaryCharacter = '/\G ' . $ regexBoundaries . '/ ' ;
774
- $ this -> nextTokenRegexReservedToplevel = '/\G ' . $ regexReservedToplevel . '(?=$|\s| ' . $ regexBoundaries . ')/ ' ;
775
- $ this -> nextTokenRegexReservedNewline = '/\G ' . $ regexReservedNewline . '(?=$|\s| ' . $ regexBoundaries . ')/ ' ;
776
- $ this -> nextTokenRegexReserved = '/\G ' . $ regexReserved . '(?=$|\s| ' . $ regexBoundaries . ')/ ' ;
777
- $ this -> nextTokenRegexFunction = '/\G ' . $ regexFunction . '(?=\s*\()/ ' ;
778
- $ this -> nextTokenRegexNonReserved = '/\G.*?(?=$|\s|[" \'`]| ' . $ regexBoundaries . ')/ ' ;
775
+ self :: $ nextTokenRegexNumber = '/\G(?:\d+(?:\.\d+)?|0x[\da-fA-F]+|0b[01]+)(?=$|\s|" \'`| ' . $ regexBoundaries . ')/ ' ;
776
+ self :: $ nextTokenRegexBoundaryCharacter = '/\G ' . $ regexBoundaries . '/ ' ;
777
+ self :: $ nextTokenRegexReservedToplevel = '/\G ' . $ regexReservedToplevel . '(?=$|\s| ' . $ regexBoundaries . ')/ ' ;
778
+ self :: $ nextTokenRegexReservedNewline = '/\G ' . $ regexReservedNewline . '(?=$|\s| ' . $ regexBoundaries . ')/ ' ;
779
+ self :: $ nextTokenRegexReserved = '/\G ' . $ regexReserved . '(?=$|\s| ' . $ regexBoundaries . ')/ ' ;
780
+ self :: $ nextTokenRegexFunction = '/\G ' . $ regexFunction . '(?=\s*\()/ ' ;
781
+ self :: $ nextTokenRegexNonReserved = '/\G.*?(?=$|\s|[" \'`]| ' . $ regexBoundaries . ')/ ' ;
779
782
}
780
783
781
784
/** @param list<string> $values */
@@ -946,7 +949,7 @@ private function createNextToken(string $string, string $upper, int $offset, Tok
946
949
// Number (decimal, binary, or hex)
947
950
if (
948
951
preg_match (
949
- $ this -> nextTokenRegexNumber ,
952
+ self :: $ nextTokenRegexNumber ,
950
953
$ string ,
951
954
$ matches ,
952
955
0 ,
@@ -957,7 +960,7 @@ private function createNextToken(string $string, string $upper, int $offset, Tok
957
960
}
958
961
959
962
// Boundary Character (punctuation and symbols)
960
- if (preg_match ($ this -> nextTokenRegexBoundaryCharacter , $ string , $ matches , 0 , $ offset )) {
963
+ if (preg_match (self :: $ nextTokenRegexBoundaryCharacter , $ string , $ matches , 0 , $ offset )) {
961
964
return new Token (Token::TOKEN_TYPE_BOUNDARY , $ matches [0 ]);
962
965
}
963
966
@@ -967,7 +970,7 @@ private function createNextToken(string $string, string $upper, int $offset, Tok
967
970
// Top Level Reserved Word
968
971
if (
969
972
preg_match (
970
- $ this -> nextTokenRegexReservedToplevel ,
973
+ self :: $ nextTokenRegexReservedToplevel ,
971
974
$ upper ,
972
975
$ matches ,
973
976
0 ,
@@ -983,7 +986,7 @@ private function createNextToken(string $string, string $upper, int $offset, Tok
983
986
// Newline Reserved Word
984
987
if (
985
988
preg_match (
986
- $ this -> nextTokenRegexReservedNewline ,
989
+ self :: $ nextTokenRegexReservedNewline ,
987
990
$ upper ,
988
991
$ matches ,
989
992
0 ,
@@ -999,7 +1002,7 @@ private function createNextToken(string $string, string $upper, int $offset, Tok
999
1002
// Other Reserved Word
1000
1003
if (
1001
1004
preg_match (
1002
- $ this -> nextTokenRegexReserved ,
1005
+ self :: $ nextTokenRegexReserved ,
1003
1006
$ upper ,
1004
1007
$ matches ,
1005
1008
0 ,
@@ -1015,15 +1018,15 @@ private function createNextToken(string $string, string $upper, int $offset, Tok
1015
1018
1016
1019
// A function must be succeeded by '('
1017
1020
// this makes it so "count(" is considered a function, but "count" alone is not function
1018
- if (preg_match ($ this -> nextTokenRegexFunction , $ upper , $ matches , 0 , $ offset )) {
1021
+ if (preg_match (self :: $ nextTokenRegexFunction , $ upper , $ matches , 0 , $ offset )) {
1019
1022
return new Token (
1020
1023
Token::TOKEN_TYPE_RESERVED ,
1021
1024
substr ($ string , $ offset , strlen ($ matches [0 ])),
1022
1025
);
1023
1026
}
1024
1027
1025
1028
// Non reserved word
1026
- preg_match ($ this -> nextTokenRegexNonReserved , $ string , $ matches , 0 , $ offset );
1029
+ preg_match (self :: $ nextTokenRegexNonReserved , $ string , $ matches , 0 , $ offset );
1027
1030
1028
1031
return new Token (Token::TOKEN_TYPE_WORD , $ matches [0 ]);
1029
1032
}
0 commit comments