code: func (r *Lexer) processEscape(data []byte) (int, error) {
  	if len(data) < 2 {
  		return 0, fmt.Errorf("syntax error at %v", string(data))
  	}
  
  	c := data[1]
  	switch c {
  	case '"', '/', '\\':
  		r.token.byteValue = append(r.token.byteValue, c)
  		return 2, nil
  	case 'b':
  		r.token.byteValue = append(r.token.byteValue, '\b')
  		return 2, nil
  	case 'f':
  		r.token.byteValue = append(r.token.byteValue, '\f')
  		return 2, nil
  	case 'n':
  		r.token.byteValue = append(r.token.byteValue, '\n')
  		return 2, nil
  	case 'r':
  		r.token.byteValue = append(r.token.byteValue, '\r')
  		return 2, nil
  	case 't':
  		r.token.byteValue = append(r.token.byteValue, '\t')
  		return 2, nil
  	case 'u':
  		rr := getu4(data)
  		if rr < 0 {
  			return 0, errors.New("syntax error")
  		}
  
  		read := 6
  		if utf16.IsSurrogate(rr) {
  			rr1 := getu4(data[read:])
  			if dec := utf16.DecodeRune(rr, rr1); dec != unicode.ReplacementChar {
  				read += 6
  				rr = dec
  			} else {
  				rr = unicode.ReplacementChar
  			}
  		}
  		var d [4]byte
  		s := utf8.EncodeRune(d[:], rr)
  		r.token.byteValue = append(r.token.byteValue, d[:s]...)
  		return read, nil
  	}
  
  	return 0, errors.New("syntax error")
  }
docs: // processEscape processes a single escape sequence and returns number of bytes processed.