code: func (j *JSONPath) evalIdentifier(input []reflect.Value, node *IdentifierNode) ([]reflect.Value, error) {
  	results := []reflect.Value{}
  	switch node.Name {
  	case "range":
  		j.stack = append(j.stack, j.cur)
  		j.beginRange += 1
  		results = input
  	case "end":
  		if j.endRange < j.inRange { //inside a loop, break the current block
  			j.endRange += 1
  			break
  		}
  		// the loop is about to end, pop value and continue the following execution
  		if len(j.stack) > 0 {
  			j.cur, j.stack = j.stack[len(j.stack)-1], j.stack[:len(j.stack)-1]
  		} else {
  			return results, fmt.Errorf("not in range, nothing to end")
  		}
  	default:
  		return input, fmt.Errorf("unrecongnized identifier %v", node.Name)
  	}
  	return results, nil
  }
docs: // evalIdentifier evaluates IdentifierNode