code: func Parse(e string) (*expr, string, error) {
  	// skip whitespace
  	for len(e) > 1 && e[0] == ' ' {
  		e = e[1:]
  	}
  
  	if len(e) == 0 {
  		return nil, "", ErrMissingExpr
  	}
  
  	if '0' <= e[0] && e[0] <= '9' || e[0] == '-' || e[0] == '+' {
  		return parseConst(e)
  	}
  
  	if val, ok := strToBool(e); ok {
  		// 'false' is 5 chars, 'true' is 4
  		size := 5
  		if val {
  			size = 4
  		}
  		return &expr{bool: val, str: e[:size], etype: etBool}, e[size:], nil
  	}
  
  	if e[0] == '\'' || e[0] == '"' {
  		val, e, err := parseString(e)
  		return &expr{str: val, etype: etString}, e, err
  	}
  
  	name, e := parseName(e)
  
  	if name == "" {
  		return nil, e, ErrMissingArg
  	}
  
  	if e != "" && e[0] == '(' {
  		for i := range name {
  			if !isFnChar(name[i]) {
  				return nil, "", ErrIllegalCharacter
  			}
  		}
  
  		exp := &expr{str: name, etype: etFunc}
  
  		ArgString, posArgs, namedArgs, e, err := parseArgList(e)
  		exp.argsStr = ArgString
  		exp.args = posArgs
  		exp.namedArgs = namedArgs
  
  		return exp, e, err
  	}
  
  	return &expr{str: name, etype: etName}, e, nil
  }
docs: // Parses an expression string and turns it into an expression
  // also returns any leftover data that could not be parsed