public function tokenize(string $value): array
    {
        $value = preg_replace(
            '/(.*?)<((?:.*?:)?(?:\p{L}|_|[0-9])+?)\((.*?)/',
            sprintf('$1%1$sFUNCTION_START__$2__%1$s$3', self::DELIMITER),
            $value
        );
        $value = preg_replace(
            '/<\(/',
            sprintf('%1$sIDENTITY_START%1$s', self::DELIMITER),
            $value
        );
        $value = preg_replace(
            '/\)>/',
            sprintf('%1$sIDENTITY_OR_FUNCTION_END%1$s', self::DELIMITER),
            $value
        );

        return preg_split(sprintf('/%s/', self::DELIMITER), $value, -1, PREG_SPLIT_NO_EMPTY);
    }