$pattern) { $tokenString = $this->matchPattern( $buffer, $offset, $pattern ); if (!empty($tokenString)) { return new Token( $type, $tokenString, $offset ); } } return NULL; } protected function matchCharacters(string $buffer, int $offset, array $chars): ?Token { if (isset($buffer[$offset])) { $char = $buffer[$offset]; foreach ($chars as $type => $expectedChar) { if ($char === $expectedChar) { return new Token($type, $char, $offset); } } } return NULL; } } }