code: def visit_Alt(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
  
imports: import argparse
  import pprint
  import sys
  from typing import Dict, Set
  from pegen.build import build_parser
  from pegen.grammar import Alt, Cut, Gather, GrammarVisitor, Group, Lookahead, NamedItem, NameLeaf, NegativeLookahead, Opt, Repeat0, Repeat1, Rhs, Rule, StringLeaf
  from pegen.parser_generator import compute_nullables
label_desc: Use image node_id 3 for calling the FirstSetCalculator obj's underlying member method code with example usage: obj.visit_Alt(item) and returns: result