def METHOD_NAME(self, item: Alt) -> Set[str]:
    result: Set[str] = set()
    to_remove: Set[str] = set()
    for other in item.items:
        new_terminals = self.visit(other)
        if isinstance(other.item, NegativeLookahead):
            to_remove |= new_terminals
        result |= new_terminals
        if to_remove:
            result -= to_remove
        # If the set of new terminals can start with the empty string,
        # it means that the item is completely nullable and we should
        # also considering at least the next item in case the current
        # one fails to parse.
        if "" in new_terminals:
            continue
        if not isinstance(other.item, (Opt, NegativeLookahead, Repeat0)):
            break
    # Do not allow the empty string to propagate.
    result.discard("")
    return result