docs: def add_block(self, name):
          """ Adds a new block to the AST.
  
              `name`
                  Block name.
  
              * Raises a ``ValueError`` exception if `name` is invalid or
                an existing block name matches value provided for `name`.
              """
  
          if not self.RE_NAME.match(name):
              raise ValueError(u"Invalid block name '{0}'"
                               .format(common.from_utf8(name)))
  
          if name in self._block_map:
              raise ValueError(u"Block '{0}' already exists"
                               .format(common.from_utf8(name)))
  
          # add new block and index mapping
          self._block_map[name] = len(self._ast[2])  # must come first
          option_list = []
          block = [name, option_list]
          self._ast[2].append(block)