diff options
Diffstat (limited to 'vendor/doctrine/orm/src/Query/Lexer.php')
| -rw-r--r-- | vendor/doctrine/orm/src/Query/Lexer.php | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/vendor/doctrine/orm/src/Query/Lexer.php b/vendor/doctrine/orm/src/Query/Lexer.php new file mode 100644 index 0000000..c446675 --- /dev/null +++ b/vendor/doctrine/orm/src/Query/Lexer.php | |||
| @@ -0,0 +1,150 @@ | |||
| 1 | <?php | ||
| 2 | |||
| 3 | declare(strict_types=1); | ||
| 4 | |||
| 5 | namespace Doctrine\ORM\Query; | ||
| 6 | |||
| 7 | use Doctrine\Common\Lexer\AbstractLexer; | ||
| 8 | |||
| 9 | use function constant; | ||
| 10 | use function ctype_alpha; | ||
| 11 | use function defined; | ||
| 12 | use function is_numeric; | ||
| 13 | use function str_contains; | ||
| 14 | use function str_replace; | ||
| 15 | use function stripos; | ||
| 16 | use function strlen; | ||
| 17 | use function strtoupper; | ||
| 18 | use function substr; | ||
| 19 | |||
| 20 | /** | ||
| 21 | * Scans a DQL query for tokens. | ||
| 22 | * | ||
| 23 | * @extends AbstractLexer<TokenType, string> | ||
| 24 | */ | ||
| 25 | class Lexer extends AbstractLexer | ||
| 26 | { | ||
| 27 | /** | ||
| 28 | * Creates a new query scanner object. | ||
| 29 | * | ||
| 30 | * @param string $input A query string. | ||
| 31 | */ | ||
| 32 | public function __construct(string $input) | ||
| 33 | { | ||
| 34 | $this->setInput($input); | ||
| 35 | } | ||
| 36 | |||
| 37 | /** | ||
| 38 | * {@inheritDoc} | ||
| 39 | */ | ||
| 40 | protected function getCatchablePatterns(): array | ||
| 41 | { | ||
| 42 | return [ | ||
| 43 | '[a-z_][a-z0-9_]*\:[a-z_][a-z0-9_]*(?:\\\[a-z_][a-z0-9_]*)*', // aliased name | ||
| 44 | '[a-z_\\\][a-z0-9_]*(?:\\\[a-z_][a-z0-9_]*)*', // identifier or qualified name | ||
| 45 | '(?:[0-9]+(?:[\.][0-9]+)*)(?:e[+-]?[0-9]+)?', // numbers | ||
| 46 | "'(?:[^']|'')*'", // quoted strings | ||
| 47 | '\?[0-9]*|:[a-z_][a-z0-9_]*', // parameters | ||
| 48 | ]; | ||
| 49 | } | ||
| 50 | |||
| 51 | /** | ||
| 52 | * {@inheritDoc} | ||
| 53 | */ | ||
| 54 | protected function getNonCatchablePatterns(): array | ||
| 55 | { | ||
| 56 | return ['\s+', '--.*', '(.)']; | ||
| 57 | } | ||
| 58 | |||
| 59 | protected function getType(string &$value): TokenType | ||
| 60 | { | ||
| 61 | $type = TokenType::T_NONE; | ||
| 62 | |||
| 63 | switch (true) { | ||
| 64 | // Recognize numeric values | ||
| 65 | case is_numeric($value): | ||
| 66 | if (str_contains($value, '.') || stripos($value, 'e') !== false) { | ||
| 67 | return TokenType::T_FLOAT; | ||
| 68 | } | ||
| 69 | |||
| 70 | return TokenType::T_INTEGER; | ||
| 71 | |||
| 72 | // Recognize quoted strings | ||
| 73 | case $value[0] === "'": | ||
| 74 | $value = str_replace("''", "'", substr($value, 1, strlen($value) - 2)); | ||
| 75 | |||
| 76 | return TokenType::T_STRING; | ||
| 77 | |||
| 78 | // Recognize identifiers, aliased or qualified names | ||
| 79 | case ctype_alpha($value[0]) || $value[0] === '_' || $value[0] === '\\': | ||
| 80 | $name = 'Doctrine\ORM\Query\TokenType::T_' . strtoupper($value); | ||
| 81 | |||
| 82 | if (defined($name)) { | ||
| 83 | $type = constant($name); | ||
| 84 | |||
| 85 | if ($type->value > 100) { | ||
| 86 | return $type; | ||
| 87 | } | ||
| 88 | } | ||
| 89 | |||
| 90 | if (str_contains($value, '\\')) { | ||
| 91 | return TokenType::T_FULLY_QUALIFIED_NAME; | ||
| 92 | } | ||
| 93 | |||
| 94 | return TokenType::T_IDENTIFIER; | ||
| 95 | |||
| 96 | // Recognize input parameters | ||
| 97 | case $value[0] === '?' || $value[0] === ':': | ||
| 98 | return TokenType::T_INPUT_PARAMETER; | ||
| 99 | |||
| 100 | // Recognize symbols | ||
| 101 | case $value === '.': | ||
| 102 | return TokenType::T_DOT; | ||
| 103 | |||
| 104 | case $value === ',': | ||
| 105 | return TokenType::T_COMMA; | ||
| 106 | |||
| 107 | case $value === '(': | ||
| 108 | return TokenType::T_OPEN_PARENTHESIS; | ||
| 109 | |||
| 110 | case $value === ')': | ||
| 111 | return TokenType::T_CLOSE_PARENTHESIS; | ||
| 112 | |||
| 113 | case $value === '=': | ||
| 114 | return TokenType::T_EQUALS; | ||
| 115 | |||
| 116 | case $value === '>': | ||
| 117 | return TokenType::T_GREATER_THAN; | ||
| 118 | |||
| 119 | case $value === '<': | ||
| 120 | return TokenType::T_LOWER_THAN; | ||
| 121 | |||
| 122 | case $value === '+': | ||
| 123 | return TokenType::T_PLUS; | ||
| 124 | |||
| 125 | case $value === '-': | ||
| 126 | return TokenType::T_MINUS; | ||
| 127 | |||
| 128 | case $value === '*': | ||
| 129 | return TokenType::T_MULTIPLY; | ||
| 130 | |||
| 131 | case $value === '/': | ||
| 132 | return TokenType::T_DIVIDE; | ||
| 133 | |||
| 134 | case $value === '!': | ||
| 135 | return TokenType::T_NEGATE; | ||
| 136 | |||
| 137 | case $value === '{': | ||
| 138 | return TokenType::T_OPEN_CURLY_BRACE; | ||
| 139 | |||
| 140 | case $value === '}': | ||
| 141 | return TokenType::T_CLOSE_CURLY_BRACE; | ||
| 142 | |||
| 143 | // Default | ||
| 144 | default: | ||
| 145 | // Do nothing | ||
| 146 | } | ||
| 147 | |||
| 148 | return $type; | ||
| 149 | } | ||
| 150 | } | ||
