':rtype: iter(Tree)
:return: An iterator of all parses that can be generated by
expanding the first element of ``frontier`` with
``production``.  In particular, if the first element of
``frontier`` is a subtree whose node type is equal to
``production``\'s left hand side, then add a child to that
subtree for each element of ``production``\'s right hand
side; and return all parses that can be generated by
matching and expanding the remaining elements of
``frontier``.  If the first element of ``frontier`` is not a
subtree whose node type is equal to ``production``\'s left
hand side, then return an empty list.  If ``production`` is
not specified, then return a list of all parses that can
be generated by expanding the first element of ``frontier``
with *any* CFG production.
:type tree: Tree
:param tree: A partial structure for the text that is
currently being parsed.  The elements of ``tree``
that are specified by ``frontier`` have not yet been
expanded or matched.
:type remaining_text: list(str)
:param remaining_text: The portion of the text that is not yet
covered by ``tree``.
:type frontier: list(tuple(int))
:param frontier: A list of the locations within ``tree`` of
all subtrees that have not yet been expanded, and all
leaves that have not yet been matched.'

def _expand(self, remaining_text, tree, frontier, production=None):

    if (production is None):
        productions = self._grammar.productions()
    else:
        productions = [production]
    for production in productions:
        lhs = production.lhs().symbol()
        if (lhs == tree[frontier[0]].label()):
            subtree = self._production_to_tree(production)
            if (frontier[0] == ()):
                newtree = subtree
            else:
                newtree = tree.copy(deep=True)
                newtree[frontier[0]] = subtree
            new_frontier = [(frontier[0] + (i,)) for i in range(len(production.rhs()))]
            if self._trace:
                self._trace_expand(newtree, new_frontier, production)
            for result in self._parse(remaining_text, newtree, (new_frontier + frontier[1:])):
                (yield result)
