func parse_token(token string) (op string, key string, args interface{}, err error) {
	if token == "$" {
		return "root", "$", nil, nil
	}
	if token == "*" {
		return "scan", "*", nil, nil
	}

	bracket_idx := strings.Index(token, "[")
	if bracket_idx < 0 {
		return "key", token, nil, nil
	} else {
		key = token[:bracket_idx]
		tail := token[bracket_idx:]
		if len(tail) < 3 {
			err = fmt.Errorf("len(tail) should >=3, %v", tail)
			return
		}
		tail = tail[1 : len(tail)-1]

		//fmt.Println(key, tail)
		if strings.Contains(tail, "?") {
			// filter -------------------------------------------------
			op = "filter"
			if strings.HasPrefix(tail, "?(") && strings.HasSuffix(tail, ")") {
				args = strings.Trim(tail[2:len(tail)-1], " ")
			}
			return
		} else if strings.Contains(tail, ":") {
			// range ----------------------------------------------
			op = "range"
			tails := strings.Split(tail, ":")
			if len(tails) != 2 {
				err = fmt.Errorf("only support one range(from, to): %v", tails)
				return
			}
			var frm interface{}
			var to interface{}
			if frm, err = strconv.Atoi(strings.Trim(tails[0], " ")); err != nil {
				if strings.Trim(tails[0], " ") == "" {
					err = nil
				}
				frm = nil
			}
			if to, err = strconv.Atoi(strings.Trim(tails[1], " ")); err != nil {
				if strings.Trim(tails[1], " ") == "" {
					err = nil
				}
				to = nil
			}
			args = [2]interface{}{frm, to}
			return
		} else if tail == "*" {
			op = "range"
			args = [2]interface{}{nil, nil}
			return
		} else {
			// idx ------------------------------------------------
			op = "idx"
			res := []int{}
			for _, x := range strings.Split(tail, ",") {
				if i, err := strconv.Atoi(strings.Trim(x, " ")); err == nil {
					res = append(res, i)
				} else {
					return "", "", nil, err
				}
			}
			args = res
		}
	}
	return op, key, args, nil
}
func parse_token(token string) (op string, key string, args interface{}, err error) {
	if token == "$" {
		return "root", "$", nil, nil
	}
	if token == "*" {
		return "scan", "*", nil, nil
	}

	bracket_idx := strings.Index(token, "[")
	if bracket_idx < 0 {
		return "key", token, nil, nil
	} else {
		key = token[:bracket_idx]
		tail := token[bracket_idx:]
		if len(tail) < 3 {
			err = fmt.Errorf("len(tail) should >=3, %v", tail)
			return
		}
		tail = tail[1 : len(tail)-1]

		
		if strings.Contains(tail, "?") {
			
			op = "filter"
			if strings.HasPrefix(tail, "?(") && strings.HasSuffix(tail, ")") {
				args = strings.Trim(tail[2:len(tail)-1], " ")
			}
			return
		} else if strings.Contains(tail, ":") {
			
			op = "range"
			tails := strings.Split(tail, ":")
			if len(tails) != 2 {
				err = fmt.Errorf("only support one range(from, to): %v", tails)
				return
			}
			var frm interface{}
			var to interface{}
			if frm, err = strconv.Atoi(strings.Trim(tails[0], " ")); err != nil {
				if strings.Trim(tails[0], " ") == "" {
					err = nil
				}
				frm = nil
			}
			if to, err = strconv.Atoi(strings.Trim(tails[1], " ")); err != nil {
				if strings.Trim(tails[1], " ") == "" {
					err = nil
				}
				to = nil
			}
			args = [2]interface{}{frm, to}
			return
		} else if tail == "*" {
			op = "range"
			args = [2]interface{}{nil, nil}
			return
		} else {
			
			op = "idx"
			res := []int{}
			for _, x := range strings.Split(tail, ",") {
				if i, err := strconv.Atoi(strings.Trim(x, " ")); err == nil {
					res = append(res, i)
				} else {
					return "", "", nil, err
				}
			}
			args = res
		}
	}
	return op, key, args, nil
}
func parse_token ( token string ) ( op string , key string , args interface { } , err error ) { if token == " " { return " " , " " , nil , nil } if token == " " { return " " , " " , nil , nil } bracket_idx := strings . Index ( token , " " ) if bracket_idx < 0 { return " " , token , nil , nil } else { key = token [ : bracket_idx ] tail := token [ bracket_idx : ] if len ( tail ) < 3 { err = fmt . Errorf ( " " , tail ) return } tail = tail [ 1 : len ( tail ) - 1 ] //fmt.Println(key, tail) if strings . Contains ( tail , " " ) { // filter ------------------------------------------------- op = " " if strings . HasPrefix ( tail , " " ) && strings . HasSuffix ( tail , " " ) { args = strings . Trim ( tail [ 2 : len ( tail ) - 1 ] , " " ) } return } else if strings . Contains ( tail , " " ) { // range ---------------------------------------------- op = " " tails := strings . Split ( tail , " " ) if len ( tails ) != 2 { err = fmt . Errorf ( " " , tails ) return } var frm interface { } var to interface { } if frm , err = strconv . Atoi ( strings . Trim ( tails [ 0 ] , " " ) ) ; err != nil { if strings . Trim ( tails [ 0 ] , " " ) == " " { err = nil } frm = nil } if to , err = strconv . Atoi ( strings . Trim ( tails [ 1 ] , " " ) ) ; err != nil { if strings . Trim ( tails [ 1 ] , " " ) == " " { err = nil } to = nil } args = [ 2 ] interface { } { frm , to } return } else if tail == " " { op = " " args = [ 2 ] interface { } { nil , nil } return } else { // idx ------------------------------------------------ op = " " res := [ ] int { } for _ , x := range strings . Split ( tail , " " ) { if i , err := strconv . Atoi ( strings . Trim ( x , " " ) ) ; err == nil { res = append ( res , i ) } else { return " " , " " , nil , err } } args = res } } return op , key , args , nil }
/*
 op: "root", "key", "idx", "range", "filter", "scan"
*/
/ * op : root key idx range filter scan