code: func parseNameVal(rest string, key string, d *Directive) (*Node, error) {
  	// This is kind of tricky because we need to support the old
  	// variant:   KEY name value
  	// as well as the new one:    KEY name=value ...
  	// The trigger to know which one is being used will be whether we hit
  	// a space or = first.  space ==> old, "=" ==> new
  
  	words := parseWords(rest, d)
  	if len(words) == 0 {
  		return nil, nil
  	}
  
  	// Old format (KEY name value)
  	if !strings.Contains(words[0], "=") {
  		parts := tokenWhitespace.Split(rest, 2)
  		if len(parts) < 2 {
  			return nil, fmt.Errorf(key + " must have two arguments")
  		}
  		return newKeyValueNode(parts[0], parts[1]), nil
  	}
  
  	var rootNode *Node
  	var prevNode *Node
  	for _, word := range words {
  		if !strings.Contains(word, "=") {
  			return nil, fmt.Errorf("Syntax error - can't find = in %q. Must be of the form: name=value", word)
  		}
  
  		parts := strings.SplitN(word, "=", 2)
  		node := newKeyValueNode(parts[0], parts[1])
  		rootNode, prevNode = appendKeyValueNode(node, rootNode, prevNode)
  	}
  
  	return rootNode, nil
  }
docs: // parse environment like statements. Note that this does *not* handle
  // variable interpolation, which will be handled in the evaluator.