code: def parse_symbol(self):
          
          assert self.pos < len(self.string)
          assert self.string[self.pos] == SYMBOL_DELIM
  
          if self.pos == len(self.string) - 1:
              # Last character.
              self.parts.append(SYMBOL_DELIM)
              self.pos += 1
              return
  
          next_char = self.string[self.pos + 1]
          start_pos = self.pos
          self.pos += 1
  
          if next_char == GROUP_OPEN:
              # A symbol like ${this}.
              self.pos += 1  # Skip opening.
              closer = self.string.find(GROUP_CLOSE, self.pos)
              if closer == -1 or closer == self.pos:
                  # No closing brace found or identifier is empty.
                  self.parts.append(self.string[start_pos:self.pos])
              else:
                  # Closer found.
                  ident = self.string[self.pos:closer]
                  self.pos = closer + 1
                  self.parts.append(Symbol(ident,
                                           self.string[start_pos:self.pos]))
  
          else:
              # A bare-word symbol.
              ident = self._parse_ident()
              if ident:
                  # Found a real symbol.
                  self.parts.append(Symbol(ident,
                                           self.string[start_pos:self.pos]))
              else:
                  # A standalone $.
                  self.parts.append(SYMBOL_DELIM)
docs: Parse a variable reference (like ``$foo`` or ``${foo}``)
          starting at ``pos``. Possibly appends a Symbol object (or,
          failing that, text) to the ``parts`` field and updates ``pos``.
          The character at ``pos`` must, as a precondition, be ``$``.