@@ -842,7 +842,7 @@ public function parseNumber()
842842 // or "E" causing wrongly interpreted scientific notation (".e[0 to 9]" is invalid). Such invalid notation could
843843 // break the lexer when table names under a given database context starts with ".e[0-9]".
844844 //
845- // Valid final states are: 2, 3, 4 and 6 . Any parsing that finished in a
845+ // Valid final states are: 2, 3, 4, 6, and 9 . Any parsing that finished in a
846846 // state other than these is invalid.
847847 // Also, negative states are invalid states.
848848 $ iBak = $ this ->last ;
@@ -886,29 +886,25 @@ public function parseNumber()
886886 $ state = 4 ;
887887 } elseif ($ this ->str [$ this ->last ] === 'e ' || $ this ->str [$ this ->last ] === 'E ' ) {
888888 $ state = 5 ;
889- } elseif (
890- ($ this ->str [$ this ->last ] >= 'a ' && $ this ->str [$ this ->last ] <= 'z ' )
891- || ($ this ->str [$ this ->last ] >= 'A ' && $ this ->str [$ this ->last ] <= 'Z ' )
892- ) {
893- // A number can't be directly followed by a letter
894- $ state = -$ state ;
895- break ;
896889 } elseif ($ this ->str [$ this ->last ] < '0 ' || $ this ->str [$ this ->last ] > '9 ' ) {
890+ if (! Context::isSeparator ($ this ->str [$ this ->last ])) {
891+ // A number can't be directly followed by a letter _ or $
892+ $ state = -$ state ;
893+ }
894+
897895 // Just digits and `.`, `e` and `E` are valid characters.
898896 break ;
899897 }
900898 } elseif ($ state === 4 ) {
901899 $ flags |= Token::FLAG_NUMBER_FLOAT ;
902900 if ($ this ->str [$ this ->last ] === 'e ' || $ this ->str [$ this ->last ] === 'E ' ) {
903901 $ state = 5 ;
904- } elseif (
905- ($ this ->str [$ this ->last ] >= 'a ' && $ this ->str [$ this ->last ] <= 'z ' )
906- || ($ this ->str [$ this ->last ] >= 'A ' && $ this ->str [$ this ->last ] <= 'Z ' )
907- ) {
908- // A number can't be directly followed by a letter
909- $ state = -$ state ;
910- break ;
911902 } elseif ($ this ->str [$ this ->last ] < '0 ' || $ this ->str [$ this ->last ] > '9 ' ) {
903+ if (! Context::isSeparator ($ this ->str [$ this ->last ])) {
904+ // A number can't be directly followed by a letter _ or $
905+ $ state = -$ state ;
906+ }
907+
912908 // Just digits, `e` and `E` are valid characters.
913909 break ;
914910 }
@@ -919,14 +915,12 @@ public function parseNumber()
919915 || ($ this ->str [$ this ->last ] >= '0 ' && $ this ->str [$ this ->last ] <= '9 ' )
920916 ) {
921917 $ state = 6 ;
922- } elseif (
923- ($ this ->str [$ this ->last ] >= 'a ' && $ this ->str [$ this ->last ] <= 'z ' )
924- || ($ this ->str [$ this ->last ] >= 'A ' && $ this ->str [$ this ->last ] <= 'Z ' )
925- ) {
926- // A number can't be directly followed by a letter
927- $ state = -$ state ;
928- break ;
929918 } else {
919+ if (! Context::isSeparator ($ this ->str [$ this ->last ])) {
920+ // A number can't be directly followed by a letter _ or $
921+ $ state = -$ state ;
922+ }
923+
930924 break ;
931925 }
932926 } elseif ($ state === 6 ) {
0 commit comments