docs: def reads(s):
      """
      Parse a String and return the data
  
      :param s: The string to read
      :type s: :py:obj:`str`
      :returns: A dict object containing the data from s
      :raises: SyntaxError - An error occured reading the data.
      """
      _dict = PyVDF.__UseDict
      _len = len
      _whitespace = frozenset('\t ')
      _newline = frozenset('\n\r')
  
      _quote_match = PyVDF.__RE_Token_Quoted.match
      _unquote_match = PyVDF.__RE_Token_UnQuoted.match
      _max_length = PyVDF.__MaxTokenLength
  
      ci = 0
      line = 0
      grabKey = 1
  
      data = _dict()
      tree = data
  
      keys = deque()
      keyApp = keys.append
      keyPop = keys.pop
  
      try:
        while 1:
  
          while s[ci] in _whitespace:
            ci += 1
  
          char = s[ci]
  
          if char == '"':
            ci += 1
            string = _quote_match(s[ci:ci + _max_length]).group()[:-1]
            ci += _len(string)
  
            if grabKey:
              k = string
              grabKey = 0
            else:
              tree[k] = string
              grabKey = 1
  
          elif char == '\n':
            line += 1
  
          # elif char == '\r':
          #   if s[ci + 1] == '\n':
          #     ci += 1
          #   line += 1
  
          elif char == '{':
            if grabKey:
              raise Exception(PyVDF.__ERR_BlockNoKey.format(line, k))
            else:
              keyApp(k)
              tree[k] = _dict()
              tree = tree[k]
              grabKey = 1
  
          elif char == '}':
            if grabKey:
              keyPop()
              tree = data
              for key in keys:
                tree = tree[key]
            else:
              raise Exception(PyVDF.__ERR_CompanionBrace.format(line, k))
  
          elif char == '/' and s[ci + 1] == '/':
            ci += 1
            line += 1
            while 1:
              ci += 1
              if s[ci] in _newline:
                break
  
          elif char == '[':
            while 1:
              ci += 1
              if s[ci] == ']':
                break
  
          else:
            string = _unquote_match(s[ci:ci + _max_length]).group()
            ci += _len(string)
  
            if grabKey:
              k = string
              grabKey = 0
            else:
              tree[k] = string
              grabKey = 1
            continue
  
          ci += 1
  
      except IndexError:
        if _len(keys) == 0:
          return data
        raise Exception(PyVDF.__ERR_EODArray)
      except AttributeError:
        raise Exception(PyVDF.__ERR_BadToken.format(line, _max_length))