code: func parseFlowSpecNumericOpValues(typ BGPFlowSpecType, args []string, validationFunc func(uint64) error) (FlowSpecComponentInterface, error) {
  	argsLen := len(args)
  	items := make([]*FlowSpecComponentItem, 0, argsLen)
  	for idx, arg := range args {
  		m := _regexpFlowSpecNumericType.FindStringSubmatch(arg)
  		if len(m) < 4 {
  			return nil, fmt.Errorf("invalid argument for %s: %s in %q", typ.String(), arg, args)
  		}
  		operator, err := parseFlowSpecNumericOperator(m)
  		if err != nil {
  			return nil, err
  		}
  		// "true" and "false" is operator, but here handles them as value.
  		var value uint64
  		switch m[3] {
  		case "true", "false":
  			if idx != argsLen-1 {
  				return nil, fmt.Errorf("%s should be the last of each rule", m[3])
  			}
  			operator = uint8(DECNumOpValueMap[m[3]])
  		default:
  			if value, err = strconv.ParseUint(m[3], 10, 64); err != nil {
  				return nil, fmt.Errorf("invalid numeric value: %s", m[3])
  			}
  			if err = validationFunc(value); err != nil {
  				return nil, err
  			}
  		}
  		items = append(items, NewFlowSpecComponentItem(operator, value))
  	}
  
  	// Marks end-of-list bit
  	items[argsLen-1].Op |= uint8(DEC_NUM_OP_END)
  
  	return NewFlowSpecComponent(typ, items), nil
  }
docs: // Parses the pairs of operator and value for the FlowSpec numeric type. The
  // given validationFunc is applied to evaluate whether the parsed value is
  // valid or not (e.g., if exceeds range or not).
  // Note: Each of the args should be formatted in single pair of operator and
  // value before calling this function.
  // e.g.) "&==100", ">=200" or "&<300"